Go语言核心编程:Golang方法调用值拷贝与引用拷贝

比特币日报区块链技术学习语言之Golang面试题、Golang视频大全、Golang开发区块链技术系列教程。

Go语言核心编程:Golang方法调用值拷贝与引用拷贝

Golang方法调用采用值拷贝

1.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)  
}

 

1.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)
}

 

Golang方法调用采用引用拷贝

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)
}

 

go语言开发区块链、dapp开发、侧链和跨链开发,访问链接得到最新教程:https://wiki.bsatoshi.com/part-iii/go_basic

课程包括:

1.Go语言快速入门

2.Go语言开发区块链进阶

3.智能合约Solidity语言学习

4.Flutter学习

5.Flutter开发区块链钱包实战

6.eth开发dapp实战

7.波卡、cosmos go语言sdk入门开发

Click to rate this post!
[Total: 0 Average: 0]

人已赞赏
Go语言技术开发

golang与nodejs对比_go语言和nodejs哪个更好

2020-1-4 23:16:15

Go语言技术开发

Go语言基础编程:golang中的变量

2020-1-4 23:16:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索