Golang中函式傳入的/返回的slice到底是什麼?
阿新 • • 發佈:2018-12-01
slice
slice的本質是一個三元組(陣列地址,長度,容量)
一個例子
package main
import (
"fmt"
)
func test(input []int) []int{
// input: 0x40c110->{address, 4, 4}
fmt.Printf("Slice inside address: %p\n", &input)
// input: 0x40c110->{address, 4, 4},但對address的修改影響到了val:0x40c0e0->{address, 4, 4}
input[0] = -1
input = append(input, 5)
// input: 0x40c110->{address, 5, 8},但val仍然為0x40c0e0->{address, 4, 4}
fmt.Println(input, len(input), cap(input))
return input
}
func main() {
// val:0x40c0e0->{address, 4, 4}
val := []int{1, 2, 3, 4}
fmt.Printf("Slice outside address: %p\n", &val)
fmt.Println(val, len(val), cap (val))
copyVal := test(val)
fmt.Printf("Slice outside address: %p\n", &val)
fmt.Println(val, len(val), cap(val))
fmt.Printf("CopySlice address: %p\n", ©Val)
fmt.Println(copyVal, len(copyVal), cap(copyVal))
}
結果:
Slice outside address: 0x40c0e0 [1 2 3 4] 4 4 Slice inside address: 0x40c110 [-1 2 3 4 5] 5 8 Slice outside address: 0x40c0e0 [-1 2 3 4] 4 4 CopySlice address: 0x40c100 [-1 2 3 4 5] 5 8
結論:
傳入的是slice三元組的值拷貝,返回的slice三元組值拷貝給外部變數