golang的值传递和引用传递

本文深入探讨了Go语言中不同数据类型的传递机制,包括固定长度数组、切片、map、结构体等,揭示了值传递和引用传递的区别及其对程序运行的影响。
s := [3]int{1, 2, 4}
func(v [3]int) {
	v[0] = 0
}(s)
fmt.Println(s) //参数固定长度数组是值传递 输出1 2 4

func(v []int) {
	v[0] = 0
}(s[:])
fmt.Println(s) //参数非固定长度是切片是引用传递 输出0 2 4

m := map[int]int{
	1: 10,
	2: 20,
	3: 30,
}
func(v map[int]int) {
	v[3] = 40
}(m)
fmt.Println(m) //map是引用传递 输出[1:10 2:20 3:40]

//另外channel也是引用传递
//-----------------------

type Test struct {
	a int
}

t := Test{a: 1}
func(v Test) {
	v.a = 5
}(t)
fmt.Println(t) //对象是值传递 输出{1}

//其他值传递的还有string 和各种基本类型
### Golang类型与引用类型的区别 #### 类型 在 Go 语言中,类型是指当变量被赋传递给函数时会复制整个对象的数据。常见的类型有基本数据类型(如 `int`、`float64`)、结构体 (`struct`) 枚举(`bool`)等。 对于类型的变量来说,每次参或者赋都会触发一次完整的内存拷贝过程[^2]。这意味着如果修改接收者中的副本,则不会影响原始变量的内容;反之亦然。这种特性使得程序更加稳定可靠,因为不存在意外共享状态的风险。 ```go package main import "fmt" func modifyValue(x int) { x += 100 } func main() { num := 5 fmt.Println("Before:", num) modifyValue(num) fmt.Println("After :", num) // 输出 After : 5 } ``` #### 引用类型 而引用类型则是指该类别的变量存储的是指向实际数据的指针而非直接保存具体内容。典型的引用类型包括切片(slice),映射表(map),通道(channel),以及自定义接口(interface)等等。因此,在处理这些类型的对象时,实际上是在操作它们所指向的位置上的那份唯一的真实资料——这也就意味着多个不同的名字可能最终都指向同一份底层资源。 由于引用类型本质上是通过指针来访问其内部数据结构的,所以在进行参数传递或是简单地将一个引用型变量赋予另一个同种类型的实体之时,并不是真的克隆了一份新的实例出来,而是仅仅把那个原本存在的地址给了对方而已。如此一来,任何一方对共同拥有的那部分做出更改都将反映到其他持有相同参照的地方上去。 ```go package main import ( "fmt" ) type Person struct { Name string Age int } // 修改引用类型的字段 func changePerson(p *Person) { p.Age++ } func main() { person := &Person{Name: "Alice", Age: 30} fmt.Printf("Original age is %d\n", person.Age) changePerson(person) fmt.Printf("Changed age to %d\n", person.Age) // Changed age to 31 } ``` #### 使用场景 - **类型适用场合** 当希望避免不必要的副作用并确保独立性的时候应该优先选用类型。比如在一个多线程环境中为了防止竞争条件的发生就可以利用这一点让各个goroutine各自拥有自己的一套工作副本从而减少同步开销。 - **引用类型适合情况** 对于那些体积较大不易频繁复制的对象或者是需要动态调整大小的数据容器而言采用引用形式往往更为合适。另外像上面提到过的并发编程里边也经常借助channel这样的机制来进行消息通信以实现高效的异步协作模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值