一文搞懂GO语言值类型与引用类型的区别
文章插图
GOLANG
开始语Go语言与其他语言一样 , 都有多种数据类型 。 大概可以分成int,float,bool,string,数组 , 结构体(struct) , slice切片 , map, chan , interface等 。
【一文搞懂GO语言值类型与引用类型的区别】在 Go 编程语言中 , 数据类型用于声明函数和变量 。 数据类型的出现是为了把数据分成所需内存大小不同的数据 , 编程的时候需要用大数据的时候才需要申请大内存 , 就可以充分利用内存 。 编译器进行编译的时候 , 需要知道每个值的类型并且为这个值分配内存 。
值类型值类型包括基本数据类型 , int,float,bool,string,以及数组和结构体(struct) 。
值类型变量声明后 , 不管是否已经赋值 , 编译器为其分配内存 , 此时该值存储于栈上 。
值类型的默认值:
var a int//int类型默认值为 0var b string//string类型默认值为 nil空var c bool//bool类型默认值为falsevar d [2]int//数组默认值为[0 0]fmt.Println(&a) //默认已经分配内存地址 , 可以使用&来取内存地址
值拷贝:当使用等号=将一个变量的值赋给另一个变量时 , 如 j = i ,实际上是在内存中将 i 的值进行了拷贝 , 可以通过 &i 获取变量 i 的内存地址 。 此时如果修改某个变量的值 , 不会影响另一个 。
代码示例:
//变量的赋值var a =10//定义变量ab := a//将a的值赋值给bb = 101//修改b的值 , 此时不会影响afmt.Printf("a的值是%v , a的内存地址是%p\n",a,&a)//a的值是10 , a的内存地址是0xc42000e228fmt.Printf("b的值是%v , b的内存地址是%p\n",b,&b)//b的值是101 , b的内存地址是0xc42000e250//数组的赋值var c =[3]int{1,2,3}//定义一个长度为3的int类型的数组d := c//将数组c赋值给dd[1] = 100//修改数组d中索引为1的值为100fmt.Printf("c的值是%v , c的内存地址是%p\n",c,&c)//c的值是[1 2 3] , c的内存地址是0xc42000a180fmt.Printf("d的值是%v , d的内存地址是%p\n",d,&d)//d的值是[1 100 3] , d的内存地址是0xc42000a1a0
画个示例图:
文章插图
值类型
引用类型引用类型包括指针 , slice切片 , map, chan , interface 。
变量直接存放的就是一个内存地址值 , 这个地址值指向的空间存的才是值 。 所以修改其中一个 , 另外一个也会修改(同一个内存地址) 。
引用类型必须申请内存才可以使用 , make()是给引用类型申请内存空间 。
代码示例:
var a = []int{1,2,3,4,5}b := a//此时a , b都指向了内存中的[1 2 3 4 5]的地址b[1] = 10//相当于修改同一个内存地址 , 所以a的值也会改变c := make([]int,5,5)//切片的初始化copy(c,a)//将切片acopy到cc[1] = 20//copy是值类型 , 所以a不会改变fmt.Printf("a的值是%v , a的内存地址是%p\n",a,&a)//a的值是[1 10 3 4 5] , a的内存地址是0xc42000a180fmt.Printf("b的值是%v , b的内存地址是%p\n",b,&b)//b的值是[1 10 3 4 5] , b的内存地址是0xc42000a1a0fmt.Printf("c的值是%v , c的内存地址是%p\n",c,&c)//c的值是[1 20 3 4 5] , c的内存地址是0xc42000a1c0d := &a//将a的内存地址赋值给d , 取值用*da[1] = 11fmt.Printf("d的值是%v , d的内存地址是%p\n",*d,d)//d的值是[1 11 3 4 5] , d的内存地址是0xc420084060fmt.Printf("a的值是%v , a的内存地址是%p\n",a,&a)//a的值是[1 11 3 4 5] , a的内存地址是0xc420084060
画图示例下:
文章插图
引用类型
a,b,c底层数组是一样的 , 但是上层切片不同 , 所以内存地址不一样 。
结束语
文章插图
GOLANG
值类型与引用类型对于初学者来说的确有点绕 , 需要花点功夫去理解 。 最近工作也是又接触到了这块 , 所以来记录下 。 如果有错误欢迎大家指正 , 一起学习进步!
- 当初|这是我的第一部华为手机,当初花6799元买的,现在“一文不值”?
- 设计语言|全新家族设计,三星Galaxy A32渲染图曝光
- 现在入手苹果11值吗,它跟12相比到底好在哪?看完算搞懂了
- 曝光|微软新专利曝光 可以与会者面部表情和肢体语言为会议打分
- 学习C语言的软件,就突然被我绿了?
- LeetCode第1 题:两数之和 Go语言精解
- 清华大学刘知远:知识指导的自然语言处理
- 盘点:2020年5种流行的 AI 编程语言,就业高薪不是梦
- 让你彻底搞懂布隆过滤器!实现一个自己的BloomFilter
- Rust能不能做后端开发语言?