上篇文章寫了指標,大概的意思指標變數記錄的都是地址,那麼它實際運用在什麼上面呢?
我們先來看一段程式碼
package main
import "fmt"
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
shownum(num1,num2)
return
}複製程式碼
輸出結果如下
6 7複製程式碼
我們通過引數將num1和num2的值傳到了shownum函式當初
那麼我們想通過一個函式修改這兩個值呢?
在簡單加一個函式
package main
import "fmt"
func changenum(i int,i2 int) {
i=9
i2=10
}
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
changenum(num1,num2)
shownum(num1,num2)
return
}複製程式碼
我們加了一個新的函式changenum他將第一個引數和第二個引數的值修改了,那麼我們列印的結果如下
6 7複製程式碼
我們發現還是6和7
這是因為golang在傳變數的時候是用的值傳遞
什麼是值傳遞?
簡單來說就是在進行傳值的時候傳的僅僅是變數的值,而不是變數本身。
說出來有點拗口,我用圖來簡單說明一下
這是num1變數
它有自己的地址和它的變數值
那麼值傳遞傳的僅僅是他的變數值:6,而傳遞完以後我們對它就無法進行操作
我們想通過函式修改變數應該怎麼寫?
package main
import "fmt"
func changenum(i *int,i2 *int) {
*i=9 *i2=10
}
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
changenum(&num1,&num2)
shownum(num1,num2)
return
}複製程式碼
輸出結果如下
9 10複製程式碼
為什麼這時就能修改了呢
因為我們這是引用傳遞,應用傳遞可以理解傳遞的是變數自身,而不是僅僅是變數的值(傳遞的實際是變數地址)
我們傳遞了變數地址,然後通過解應用符號*來給變數賦新值以此來改變變數的的值。
這就值傳遞和引用傳遞的區別
在golang集合型別中陣列和結構體是值傳遞用關鍵字new
關鍵字建立
而map和切片是引用傳遞用關鍵字make
建立