关于函数里指针的使用
来源:4-3 扩展已有类型

幕布斯8315195
2020-03-24
老师你好,之前讲数组和结构体的时候,说是指针变量可以直接使用,请问queue.go文件里这个方法为什么不可以直接head := q[0],而必须要(*q)[0]呢
func (q *Queue) Pop() int{
head := (*q)[0]
*q = (*q)[1:]
return head
}
在讲数组和结构体的时候,说是go可以自动转换的,比如4-1章节里
func (node *Node) SetValue(value int){
if node == nil{
fmt.Println("setting value to nil node, Igored")
}
node.Value = value //这里直接使用node.value而没有使用(*node).value
}
//在main方法里代码如下:
var root tree.Node
fmt.Println("===test")
root.SetValue(1)
fmt.Println(root.Value)
写回答
2回答
-
ccmouse
2020-03-28
的确有很多同学对这个比较疑惑。这里大家要利用编译器来解决。编程不是闭卷考,我们不需要答出什么时候可以直接使用指针什么时候不可以。
直接使用指针只是编译器给我们的一个类似的“语法糖”,让我们的代码美观一下。它给不给我们都是它的决定。所以我的建议是:先试试直接使用指针行不行,比如p.Method(), p[0],如果不行,那就加上(*p),那样肯定行。
我试了一下,假设p是指针
p.Method() // 可以
var p *[]int
p[0] // 不可以
var p *[3]int
p[0] // 可以
这里并没有很特别的原因。
022020-03-31 -
gsdad_white
2020-03-24
我也看的很迷。同问老师
00