关于函数里指针的使用

来源: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] // 可以

这里并没有很特别的原因。

0
2
ccmouse
如果担心面试的话,可以把我上面总结的记下来。实际工作中,由于有编译器,它会直接告诉你,ide的话还会当场画红线,随手改掉就行。改了一两次,以后自然就知道这种该怎么写,不用刻意记忆。 具体一个非常完全的总结我也没有找到。 不过你的提议很有道理,我考虑做一个总结,到时候加在视频锚点里面。
2020-03-31
共2条回复

gsdad_white

2020-03-24

我也看的很迷。同问老师

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程