發表文章

目前顯示的是有「pointer」標籤的文章

[Go] Golang 的 slice 進階know how

之前聽別人分享使用slice 遇到有些坑,但未說明來由。 最近在閱讀 Golang 新手可能会踩的 50 个坑 ( 英文原文 ) 也看到關於slice說明的一些現象,為什麼有些值會無故消失,或者無故被更改,於是好奇花了些時間研究了一下。 下列說明配合source code,這邊就不重複貼了。 my source code on github 先說結論,slice的使用方式是pointer。 slice、map、channel 三者在Golang使用上是操作方式是pointer,不熟悉的話建議先把內容copy起來再操作比較保險。 請參考GO FAQ Why are maps, slices, and channels references while arrays are values? 我自己在寫FAQ的心得文章 有印象。 當下是以為在傳遞function的參數,和接受參數的部分對於 maps, slices, and channels 有這樣的說明,不過現在看來這個也是在講平常assign的使用上。 實驗分為test1() test2() test3()。 test1() 和test2() 把某個slice assign到另外一新的變數,表面上看似有了兩個slice,不過是多了一個新的變數名稱,其實指到相同的slice內容而已。 如果改了其中的內容,兩個slice都會影響到,因為他們是指向同樣的地方。 但若(舊的slice + 新的value) ----> 就會自動產生出新的slice,於是跟舊的slice沒有關係了,各改各的不會受影響。 test3() 將記憶體位置印出來,事實上實驗起來,可以發現每個slice裡面的index皆占了一個記憶體空間,假設有兩個slice,裡面的元素可以指向同樣的地方,也可以分別指到不同的地方 x := append(s, 11) // 只有擴到x,但s還是舊的 fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0], "ptr(x) =", &x[0]) fmt.Println("cap(s) ...

[Go] 指標 pointer with golang

以前學C和C++對指標有很大誤解,老師對不起,但您說的內容,學生當時真的不太懂,事隔多年我努力用比較簡白的文字來描述,彌補當年慘烈成績的遺憾。 以下三個都在說同樣的一件事,但我不知道為什麼以前透過function傳接球,腦袋轉不過來。 PART I b := 10 var a *int = &b 指標只能存位址(address) ,你要嘛弄個指標的型態(如範例是*int)去存人家位置,要嘛用一般的變數去存一般的值 PART II b := 10 a:= &b a 其實被宣告為*int PART III func main() { b := 10 setFunc(&b) } func setFunc(a *int) { } var a *int = &b 將『指標(命名為a) 指向b』用法就這樣,沒有別的,沒事不會亂用或單獨用『&』『*』 『int』 跟 『*int』雖然長得87分像,但兩個完全不一樣, 『int』叫做整數,『*int』如上的用途的時候叫做指標,指的對像是整數。如果『*int』可以改叫做『pointerToInt』之類的關鍵字,我大一也不會被當掉了,大概吧。 改值是另一件事, *a = 10,這時候的『星號』已經暗指a在之前已經被宣告成指標的type,這點很重要,『星號』在這時候的用途英文叫做 derefference , 中文有人叫做『提取』,不管你是一層指標,還是像C語言有人有點毛病寫了三層指標,都可以想成一層一層將內容提取出來的概念,一但用了『提取』(*a = 10),不管在哪裡都會被改到。 *a 絕對不等於 var a *int 的意思 *a : a 已經被宣告成指標,提取a 的內容 var a *int : a 被宣告為指標型態,就跟被宣告為int或者string一樣稀鬆平常,你對於int的變數只能放int,對於string的變數只能放string,那指標只能放位址,只是有點複雜,指標的型態一定還有個附加屬性,這裡是int,所以宣告為* int Created Date : 2018...