slice存的是指针

下面是写树的深度遍历函数的时候,出现的错误:

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)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值