Golang - 引用类型和值类型


定义

  • 值类型
    变量直接储存值
    值存在栈区中(栈中存放的是生命周期短的变量, 比如局部变量)

  • 引用类型
    变量储存地址, 地址储存最终的值
    存放在堆区(栈中存放的是生命周期长的变量, 比如全局变量)


数据类型

值类型引用类型
intslice
floatmap
boolchannel
stringinterface
array
struct

修改

  • 值类型赋值
    package main
    
    import "fmt"
    
    func main() {
    	// 值类型
    	a := [3]int{1, 2, 3}
    	
    	// 直接赋值
    	b := a
    	
    	b[0] = 100
    	fmt.Println(a, b) // [1 2 3] [100 2 3]
    }
    
    
  • 引用类型 - 深拷贝
    package main
    
    import "fmt"
    
    func main() {
    	// 引用类型
    	c := []int{1, 2, 3}
    
    	// 构造一个长度容量和 c 相同的切片
    	d := make([]int, len(c), cap(c))
    
    	// 深拷贝赋值
    	copy(d, c)
    
    	d[0] = 100
    	fmt.Println(c, d)
    }
    
    
  • 在函数中修改元素时
    package main
    
    // 函数传参使用, 实际上是将参数复制一份, 在函数内部修改	
    
    import "fmt"
    
    // 示例, 直接传值修改不生效
    func a(a [2]int) {
    	a[0] = 10
    }
    
    // 值类型,若需要修改,传进来的必须是指针
    func b(a *[2]int) {
    	a[0] = 10
    }
    
    // 引用类型直接传即可
    func c(a []int) {
    	a[0] = 10
    }
    
    func main() {
    	x := [2]int{1, 2}
    	a(x)
    
    	y := [2]int{1, 2}
    	b(&y)
    
    	z := []int{1, 2}
    	c(z)
    
    	fmt.Println(x, y, z) // [1 2] [10 2] [10 2]
    }
    

声明, 初始化和赋值

  • 值类型
    package main
    
    import "fmt"
    
    // 需要声明 --> 赋值
    func main() {
    	// 声明
    	var a [3]int // 此时的值为 [0 0 0]
    	// 赋值
    	a = [3]int{1, 2, 3}
    
    
    	// 声明+赋值可简写为
    	aa := [3]int{1,2,3} // 结果为[1 2 3]
    }
    
    
  • 引用类型
    package main
    
    import "fmt"
    
    // 需要声明 --> 初始化 --> 赋值
    func main() {
    	// 声明
    	var b []int // 此时的值为nil
    	// 初始化
    	b = make([]int, 0, 10) // 此时的值为[], 因为长度为0
    	// 赋值
    	b = []int{1, 2, 3}
    
    
    	// 声明+初始化可简写为
    	bb := make([]int, 0, 10) // 此时的值为[], 因为长度为0
    
    	
    	// 声明+初始化+赋值可简写为
    	bbb := []int{1, 2, 3}
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值