Golang中的值拷貝與引用拷貝


變量間的賦值(值拷貝)

a:=1
b:=a
fmt.Println(b,&a,&b)

 

 

 

方法調用

值拷貝:

1 array

golang中以array作為參數的方法調用,方法接收的是整個array的值拷貝,所以方法中對array的item重新賦值不起作用。

如以下代碼所示,輸出為[1, 2, 3]。

package main  
  
import "fmt"  
  
func modify(a [3]int) {  
    a[0] = 4  
}  
  
func main() {  
    a := [3]int{1, 2, 3}  
    modify(a)  
    fmt.Println(a)  
}  

2 struct

如下代碼傳參為struct值拷貝,modify方法或modify函數對person的name屬性重新賦值不起作用。

package main  
  
import "fmt"  
  
type person struct {  
    name string  
}  
  
func (p person) modify() {  
    p.name = "jacky"  
}  
  
func modify(p person) {  
    p.name = "jacky"  
}  
  
func main() {  
    p := person{"larry"}  
    p.modify()  
    // modify(p)  
    fmt.Println(p)  
} 

2.引用拷貝

2.1 slice

slice作為底層的數組引用,方法調用采用的是引用的拷貝。

所以,如下第一段代碼,函數的引用拷貝與原始引用指向同一塊數組,對slice的item重新賦值是生效的,輸出為[4, 2, 3]。

package main  
  
import "fmt"  
  
func modify(s []int) {  
    s[0] = 4  
}  
  
func main() {  
    s := []int{1, 2, 3}  
    modify(s)  
    fmt.Println(s)  
}

但第二段代碼,輸出結果未變化,仍為[1, 2, 3]。是因為對引用的拷貝重新賦值,並不會更改原始引用。

package main  
  
import "fmt"  
  
func modify(s []int) {  
    s = append(s, 4)  
}  
  
func main() {  
    s := []int{1, 2, 3}  
    modify(s)  
    fmt.Println(s)  
}  

所以對slice進行append操作,需要將其作為返回值返回,如以下代碼所示,輸出為[1 2 3 4]。

package main  
  
import "fmt"  
  
func modify(s []int) []int {  
    s = append(s, 4)  
    return s  
}  
  
func main() {  
    s := []int{1, 2, 3}  
    s = modify(s)  
    fmt.Println(s)  
}  

2.2 struct pointer(結構體指針)

若想改變struct的屬性值,傳參采用struct pointer。

package main  
  
import "fmt"  
  
type person struct {  
    name string  
}  
  
func (p *person) modify() {  
    p.name = "jacky"  
}  
  
func modify(p *person) {  
    p.name = "jacky"  
}  
  
func main() {  
    p := &person{"larry"}  
    p.modify()  
    // modify(p)  
    fmt.Println(p)  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM