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指標
- c++指標傳遞與引用傳遞C++指標
- Go: 指標方法與值方法<->指標型別與值型別Go指標型別
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- golang中 值型別,指標,引用的區別Golang型別指標
- 1.0 - 指標和引用指標
- go語言引數傳遞到底是傳值還是傳引用Go
- 請教一個go切片引用的問題Go
- 詳解c++指標的指標和指標的引用C++指標
- 值傳遞和引用傳遞
- GO 指標Go指標
- 傳遞指標引數(函式內部給指標賦值)示例指標函式賦值
- shared_ptr 傳值和傳引用
- 指標和引用的區別指標
- 引用的底層為指標指標
- 透過指標引用陣列指標陣列
- C++智慧指標之shared_ptr與右值引用(詳細)C++指標
- JavaScript的值傳遞和引用傳遞JavaScript
- 快速搞懂值傳遞與引用傳遞
- Java的值傳遞和引用傳遞Java
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- Golang指標隱式間接引用Golang指標
- 指向指標的常量引用瞭解指標
- Day30--值傳遞和引用傳遞
- Java - 是值傳遞還是引用傳遞Java
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- Go 陣列指標(指向陣列的指標)Go陣列指標
- C++中傳指標和傳引用的區別,各自的使用場景是什麼C++指標
- (轉發)連結串列新增函式中為什麼要用指向連結串列指標的指標(引用傳參)函式指標
- c++ 類的函式引用 指標C++函式指標
- Python的函式引數傳遞:傳值?引用?Python函式
- Python為什麼不是傳值或傳引用? - mathsppPython
- php 傳值與傳引用的理解(通俗易懂)PHP
- 解析 Go 切片:為何按值傳遞時會發生改變?|得物技術Go
- GO語言————4.9、指標Go指標
- GO 空指標和nilGo指標
- go_切片Go
- The Way To Go --- 切片Go