请稍等 ...
×

采纳答案成功!

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

关于函数里指针的使用

老师你好,之前讲数组和结构体的时候,说是指针变量可以直接使用,请问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)

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

2回答

ccmouse 2020-03-28 12:00:08

的确有很多同学对这个比较疑惑。这里大家要利用编译器来解决。编程不是闭卷考,我们不需要答出什么时候可以直接使用指针什么时候不可以。

直接使用指针只是编译器给我们的一个类似的“语法糖”,让我们的代码美观一下。它给不给我们都是它的决定。所以我的建议是:先试试直接使用指针行不行,比如p.Method(), p[0],如果不行,那就加上(*p),那样肯定行。

我试了一下,假设p是指针

p.Method() // 可以

var p *[]int

p[0] // 不可以

var p *[3]int

p[0] // 可以

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

0 回复 有任何疑惑可以回复我~
  • ZoneTw #1
    謝謝老師的回答
    "编程不是闭卷考,我们不需要答出什么时候可以直接使用指针什么时候不可以。"
    
    雖然說編程不是閉卷考, 只是感覺
    
    1. 面試好像也是有可能出這種題目
    看我們對於底層是否了解? (只是可能題目不是這一題而已)
    2. 沒有了解到一個程度, 寫出來的 code 可能會有問題, 不知道甚麼時候去採到某個坑, 然後在坑外一直尋找原因
    
    如果整個解釋起來會占用老師太多時間的話, 是否可以請老師提供一些線索, 比如說:
    官方文件有地方可以查這種底層的機制嗎?
    或者就是要直接去看 Go 的源碼, 看他的編譯器怎樣處理這個部分?
    回复 有任何疑惑可以回复我~ 2020-03-29 10:08:52
  • ccmouse #2
    如果担心面试的话,可以把我上面总结的记下来。实际工作中,由于有编译器,它会直接告诉你,ide的话还会当场画红线,随手改掉就行。改了一两次,以后自然就知道这种该怎么写,不用刻意记忆。
    具体一个非常完全的总结我也没有找到。
    不过你的提议很有道理,我考虑做一个总结,到时候加在视频锚点里面。
    回复 有任何疑惑可以回复我~ 2020-03-31 20:36:54
gsdad_white 2020-03-24 22:11:28

我也看的很迷。同问老师

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号