在对slice进行append发现一些问题

leetcode 131题,dfs到叶子节点将每次的结果加入ans中,但是发现一些问题。
下面把每次改变后的ans打印出来,发现第一个append到ans的slice被修改了,百思不得其解,来问问各位大佬。跪求!
image

package main

import (
	"fmt"
)

func partition(s string) [][]string {
	ans := make([][]string, 0)

	check := func(s string) bool {
		i, j := 0, len(s)-1
		for i < j {
			if s[i] != s[j] {
				return false
			}
			i++
			j--
		}
		return true
	}

	var dfs func(s string, tmp []string)
	dfs = func(s string, tmp []string) {
		if len(s) == 0 {
			ans = append(ans, tmp)
			fmt.Println(ans) //打印到叶子节点时的ans(添加新结果后的情况)
			return
		}
		for i := 1; i <= len(s); i++ {
			if check(s[:i]) {
				dfs(s[i:], append(tmp, s[:i]))
			}
		}
	}
	dfs(s, []string{})
	return ans
}

func main() {
	ans := partition("ababbbab")
	fmt.Println(len(ans))
}

测试了几个字符串,只有对“ababbbab”会出现这样的现象,对于其他串如“ababbba”是正常的

已解决,tmp还要在递归中继续被修改,不能将它的引用append到ans中

func partition(s string) [][]string {
	ans := [][]string{}

	check := func(s string) bool {
		i, j := 0, len(s)-1
		for i <= j {
			if s[i] != s[j] {
				return false
			}
			i++
			j--

		}
		return true
	}

	var dfs func(s string, ans []string)
	dfs = func(s string, tmp []string) {
		if len(s) == 0 {
            t := make([]string, len(tmp))
            copy(t, tmp) //深拷贝
            ans = append(ans, t)
			return
		}
		for i := 1; i <= len(s); i++ {
			if check(s[:i]) {
				dfs(s[i:], append(tmp, s[:i]))
			}
		}
	}
	dfs(s, []string{})
	return ans
}