请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

这些课的内容疑惑点

第一个地方:
图片描述
这里箭头指向的内存地址是谁的,我理解不应该是 nil 吗

第二个问题是:
这个接收者的问题,这个概念我有点不太懂,网上查了下资料也不太能理解。
按照我的理解:(以下面的方法为例)

	func (node treeNode) print() {
		fmt.Print(node.value, "\n")
	}
	func (node *treeNode) print2() {
		fmt.Print(node.value, "\n")
	}
	...
	func main() {
		var root treeNode
		var root2 *treeNode
		...
		root.print()
		root2.print2()
		root.print2()
		root2.print()
	}

(node treeNode) 就是值接收者类型,(node *treeNode) 就是指针接收者类型
root 是值类型的调用者,root2是指针类型的调用者
1.root.print() -> 标准的值类型调用者匹配值类型接收者
2. root2.print2() -> 标准的指针类型的调用者匹配指针类型接收者
3. root.print2() -> 值类型调用者匹配指针类型接收者 -> (&root).print2()
4. root2.print() -> 指针类型的调用者匹配值类型接收者 -> (*root2).print()

还有这个的原理我也没太明白

func (node *treeNode) setValue(info int) {
	node.value = info
}

func (node treeNode) setValue(info int) {
	node.value = info
}

结论我知道,用指针,值就发生改变,不用指针,修改就不生效。,这个副本的概念。这个副本是什么的副本?

正在回答 回答被采纳积分+3

1回答

ccmouse 2021-11-27 15:18:11

这些问题问得很好,很有针对性。

第一个问题,上面有一行root.left.right = new(treeNode)

同学指出的地方,正是打印了root.left,这个节点是有right(又子树)的。new(treeNode)会分配一个treeNode结构,并返回其执政。

第二个问题,同学关于值接收者和指针类型接收者的总结是对的。3和4两个“非标准”的写法,其实是编译器给我们提供的便利,不然写成(&root).print2()等很繁琐。“非标准”是打引号的,因为我们都会使用这些便利,其实root.print2()是一种标准的写法。

副本的概念,我们换一换:

func setValue(node treeNode, info int) {

node.value = info

}

这里node是一个函数参数,调用的时候会拷贝一个副本进入setValue内,setValue改变的只是这个副本的value。

接收者跟这个实现的机制一模一样,只是语法上不一样而已,node作为一个接收者参数,语法上搬了个位置。

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_精慕门7592651 #1
    第一个问题,那如果没有 root.left.right = new(treeNode) 是不是就是 &{0,nil,nil}了
    回复 有任何疑惑可以回复我~ 2021-11-29 11:01:14
  • ccmouse 回复 提问者 qq_精慕门7592651 #2
    是的。
    回复 有任何疑惑可以回复我~ 2021-11-29 20:36:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信