1. 程式人生 > >Golang中函式傳入的/返回的slice到底是什麼?

Golang中函式傳入的/返回的slice到底是什麼?

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", &copyVal) 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三元組值拷貝給外部變數