我是靠谱客的博主 自觉水杯,最近开发中收集的这篇文章主要介绍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)
	}
}

最后

以上就是自觉水杯为你收集整理的slice存的是指针的全部内容,希望文章能够帮你解决slice存的是指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部