这些课的内容疑惑点
来源:4-1 结构体和方法

qq_精慕门7592651
2021-11-25
第一个地方:
这里箭头指向的内存地址是谁的,我理解不应该是 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
}
结论我知道,用指针,值就发生改变,不用指针,修改就不生效。,这个副本的概念。这个副本是什么的副本?
1回答
-
ccmouse
2021-11-27
这些问题问得很好,很有针对性。
第一个问题,上面有一行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作为一个接收者参数,语法上搬了个位置。
022021-11-29
相似问题