【GO】结构体的值传递VS引用传递

简介: 【GO】结构体的值传递VS引用传递

代码

值传递案例

我们先定义了一个结构体 然后传入showPerson1这个方法里

然后在showPerson1这个方法里修改了name的值

打印结果发现是没有改变的,这是因为值传递时传递的是结构体的副本,而不是真身

image.png屏幕快照 2022-05-18 下午7.36.43.png屏幕快照 2022-05-18 下午7.36.52.png屏幕快照 2022-05-18 下午7.37.03.png屏幕快照 2022-05-18 下午7.37.14.png

package main
import "fmt"
type Person struct {
  name string
  age  int
  kaka []string
}
func main() {
  p := Person{name: "咔咔", age: 24, kaka: []string{"dalanqiu"}}
  // 值传递,传入的是并非是咔咔本人,而是咔咔的副本
  // 对副本的修改并不能影响咔咔本人
  //showPerson1(p)
  // 传入的是结构的本身(地址),并非副本
  showPerson2(&p)
  // showPerson2方法修改的值
  fmt.Println(p.name)
  // p的地址是0x11019a20
  fmt.Printf("p的地址是%p\n", &p)
}
func showPerson1(p Person) {
  // p的地址是0x11019a20
  fmt.Printf("p的地址是%p\n", &p)
  // 咔咔
  fmt.Println(p.name)
  // 24
  fmt.Println(p.age)
  // [dalanqiu]
  fmt.Println(p.kaka)
  p.name = "我不是咔咔"
}
/**
这里的参数是指针类型 在传值的时候就需要指针类型
*/
func showPerson2(p *Person) {
  // p的地址是0x11019a20
  fmt.Printf("p的地址是%p\n", &p)
  // 咔咔
  fmt.Println(p.name)
  // 24
  fmt.Println(p.age)
  // [dalanqiu]
  fmt.Println(p.kaka)
  p.name = "showPerson2方法修改的值"
}
相关文章
|
5月前
|
安全 Java Go
Java vs. Go:并发之争
【4月更文挑战第20天】
149 1
|
6天前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
24 5
|
27天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
5月前
|
算法 Java Go
Go vs Java:内存管理与垃圾回收机制对比
对比了Go和Java的内存管理与垃圾回收机制。Java依赖JVM自动管理内存,使用堆栈内存并采用多种垃圾回收算法,如标记-清除和分代收集。Go则提供更多的手动控制,内存分配与释放由分配器和垃圾回收器协同完成,使用三色标记算法并发回收。示例展示了Java中对象自动创建和销毁,而Go中开发者需注意内存泄漏。选择语言应根据项目需求和技术栈来决定。
|
8天前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
2月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
30 0
|
2月前
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)
|
2月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧
|
2月前
|
Go
Go 语言中的“继承”:使用结构体实现代码重用
Go 语言中的“继承”:使用结构体实现代码重用
30 0
|
3月前
|
Go 索引
go语言结构体使用小结
go语言结构体使用小结
34 0
下一篇
无影云桌面