天天看點

Go 數組、切片作為函數的參數。值傳遞、引用傳遞

demo.go(切片、數組作為函數的形參):

package main

import "fmt"

// 值傳遞:改變形參的值,并不會改變實參的值。(例如:數組、結構體)
// 位址傳遞(引用傳遞):改變形參的值,會影響到實參的值。(例如:切片、map、指針)(切片變量名本身就是一個位址)

// 數組作為函數的參數,是值傳遞。 修改形參不會改變實參的值。(可以通過傳回值來覆寫(修改)實參的值)
// 切片的資料存放在記憶體的堆區。 數組的資料(函數的局部變量)存放在記憶體的棧區

func main() {
	// 定義切片。
	slice := []int{0, 1, 2, 3, 4}
	test(slice)
	fmt.Printf("%p \n", slice) // 0xc000072030
	fmt.Println(slice)   // [111 1 2 3 4]  (修改形參會影響到實參)
}

// 切片作為函數的參數(位址傳遞) (切片變量名本身就是一個位址)
func test(s []int) {
	fmt.Printf("%p \n", s) // 0xc000072030 與實參的位址相同
	s[0] = 111     // 修改形參會影響到實參

	// 但是 append()添加資料時并不會影響實參(的長度)。 (可以通過傳回值覆寫(修改)實參的值(長度);或者通過切片的指針修改實參)
	s = append(s, 66,77,88)
}