GO切片傳值/引用/指標
GO切片傳值/引用/指標
鄙人一直以為切片,map 在函式呼叫過程中傳遞是值傳遞。這一點沒錯。和大家想的一樣
但是此處有一個坑需要規避
就是 當所傳原切片長度變大後。就是增長後,Go底層會為其分配新的地址來儲存更多的值,這時候你傳的原切片地址就會變成新的。
原理:
append()新增資料時並不會影響實參(的長度)。 (可以通過返回值覆蓋(修改)實參的值(長度);或者通過切片的指標修改實參)
因此當函式中對原切片的長度進行擴增,呼叫append後,地址發生了變化。在不做返回值覆蓋的情況下,需要傳入原切片的指標。
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)
}
相關文章
- Go高階特性 13 | 引數傳遞:值、引用及指標之間的區別?Go指標
- 這裡是值引用還是指標引用?指標
- 07 引用 指標 和傳遞指標
- c++指標傳遞與引用傳遞C++指標
- 指標與引用指標
- golang中 值型別,指標,引用的區別Golang型別指標
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- 1.0 - 指標和引用指標
- GO 指標Go指標
- go語言引數傳遞到底是傳值還是傳引用Go
- 請教一個go切片引用的問題Go
- 傳遞指標引數(函式內部給指標賦值)示例指標函式賦值
- C++引用和指標C++指標
- nim的引用和指標指標
- 《指標和引用小結》指標
- 細說引用和指標指標
- 值傳遞與引用傳遞
- 值傳遞和引用傳遞
- GO中的函式設計時候,引數傳遞選擇傳遞值還是傳遞指標?Go函式指標
- 引用的底層為指標指標
- [C++]指標和引用(一)C++指標
- [C++]指標和引用(二)C++指標
- [C++]指標和引用(三)C++指標
- [C++]指標和引用(四)C++指標
- 指標和引用的區別指標
- JAVA值傳參和引用傳參Java
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- 詳解c++指標的指標和指標的引用C++指標
- 關於指標傳遞和指標的指標指標
- C++中引用傳遞與指標傳遞區別(進一步整理)C++指標
- JavaScript的值傳遞和引用傳遞JavaScript
- 快速搞懂值傳遞與引用傳遞
- Java 是傳值還是傳引用 (轉)Java
- Java的值傳遞和引用傳遞Java
- Go 陣列指標(指向陣列的指標)Go陣列指標
- C++智慧指標之shared_ptr與右值引用(詳細)C++指標
- Golang指標隱式間接引用Golang指標