概述
下面是写树的深度遍历函数的时候,出现的错误:
var queue []*TrieTreeNode
func LeafToQueue(tree *TrieTree) []*TrieTreeNode{
dfsTree(queue,tree.root)
return queue
}
func dfsTree(queue []*TrieTreeNode,treeNode *TrieTreeNode){
if treeNode == nil {
return
}
if treeNode.isleaf {
if queue != nil{
queue = append(queue,treeNode)
}
}
for _,child := range treeNode.children {
dfsTree(queue,child)
}
}
经过run
之后,发现queue
中是空的,经过debug
发现queue并不随着递归的深入而发生改变,反而每次都会重置;
go语言中默认是值传递,但是slice是存储的指针,所以我实际传进入的是指针地址值;如果slice不发生扩容的情况下,是可以修改的。但在64位操作系统下,slice默认的空间只有24byte,slice通常需要扩容。扩容是把原来的slice内容拷贝到新的内存中去。这时候slice存储的旧地址的内容发生了改变,但是并没有指向新地址。所以元素没有实现实时更改。
正确的代码:
var queue *[]TrieTreeNode
//08年
func LeafToQueue1(tree *TrieTree) *[]TrieTreeNode{
queue = new([]TrieTreeNode)
dfsTree(queue,tree.root)
fmt.Println(queue)
return queue
}
func dfsTree(queue *[]TrieTreeNode,treeNode *TrieTreeNode){
if treeNode == nil {
return
}
if treeNode.isleaf {
if queue != nil{
*queue = append(*queue,*treeNode)
}
}
for _,child := range treeNode.children {
dfsTree(queue,child)
}
}
最后
以上就是自觉水杯为你收集整理的slice存的是指针的全部内容,希望文章能够帮你解决slice存的是指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复