一文搞懂GO语言值类型与引用类型的区别


一文搞懂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画个示例图:
一文搞懂GO语言值类型与引用类型的区别文章插图
值类型
引用类型引用类型包括指针 , 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画图示例下:
一文搞懂GO语言值类型与引用类型的区别文章插图
引用类型
a,b,c底层数组是一样的 , 但是上层切片不同 , 所以内存地址不一样 。
结束语
一文搞懂GO语言值类型与引用类型的区别文章插图
GOLANG
值类型与引用类型对于初学者来说的确有点绕 , 需要花点功夫去理解 。 最近工作也是又接触到了这块 , 所以来记录下 。 如果有错误欢迎大家指正 , 一起学习进步!