注:本文是對 golang-101-hacks 中文翻譯。
成都創新互聯公司專注于企業全網營銷推廣、網站重做改版、高密網站定制設計、自適應品牌網站建設、html5、購物商城網站建設、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為高密等各大城市提供網站開發制作服務。
在Go語言中,函數參數是值傳遞。使用slice作為函數參數時,函數獲取到的是slice的副本:一個指針,指向底層數組的起始地址,同時帶有slice的長度和容量。既然各位熟知數據存儲的內存的地址,現在可以對切片數據進行修改。讓我們看看下面的例子:
In Go, the function parameters are passed by value. With respect to use slice as a function argument, that means the function will get the copies of the slice: a pointer which points to the starting address of the underlying array, accompanied by the length and capacity of the slice. Oh boy! Since you know the address of the memory which is used to store the data, you can tweak the slice now. Let's see the following example:
運行結果如下
由此可見,執行modifyValue函數,切片s的元素發生了變化。盡管modifyValue函數只是操作slice的副本,但是任然改變了切片的數據元素,看另一個例子:
You can see, after running modifyValue function, the content of slice s is changed. Although the modifyValue function just gets a copy of the memory address of slice's underlying array, it is enough!
See another example:
The result is like this:
而這一次,addValue函數并沒有修改main函數中的切片s的元素。這是因為它只是操作切片s的副本,而不是切片s本身。所以如果真的想讓函數改變切片的內容,可以傳遞切片的地址:
This time, the addValue function doesn't take effect on the s slice in main function. That's because it just manipulate the copy of the s, not the "real" s.
So if you really want the function to change the content of a slice, you can pass the address of the slice:
運行結果如下
前言:go語言函數參數為值拷貝(指針參數為指針拷貝)。
在go語言中,函數也作為一種數據類型,所以函數也可以作為函數的參數來使用。
其中slice是為地址數組指針的拷貝??,持續更新中 ....
前段時間,我們實驗室用go作為后臺開發語言開發了一個web項目,由于這是自己第一次使用go語言進行開發,在開發過程中,一味著追求完成任務,在編碼的時候沒有太注重性能,雖然勉強實現了功能,但是對go語言的理解還是比較淺顯的。下面來談談自己對go語言中函數與方法的理解。
普通函數:
go函數可以返回多個值
值傳遞: 值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣函數中如果對參數進行修改,將不會影響到實際參數
引用傳遞: 引用傳遞是指在調用函數將實際參數的地址傳遞到函數中,那么在函數中對參數進行的修改,將影響到實際參數。
一般來說go語言函數的 接收者(也就是形參)一般放在函數名后面 ,不能將指針類型的數據直接傳遞,也就是說函數形參如果是值類型,調用者必須使用值作為實參過來,如果函數形參是指針類型,則函數調用者需使用指針作為實參來調用。
普通方法:
接收者是在func關鍵字后面,而不是在函數名稱后面,接收者可以是自己定義的一個類型,這個類型可以是struct、interface,一個方法就是一個包含了接收者的函數,接收者可以是命名類型或者是結構體類型的一個值或者是一個指針。
下面是一個例子來說明方法和函數的區別(重點)