目录
GO 语言变量
3,值类型和引用类型
值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。 值拷贝
引用类型:特指slice、map、channel这三种预定义类型。
引用类型拥有更复杂的存储结构:(1)分配内存 (2)初始化一系列属性等一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在另外的某一个字中。
两者的主要区别:拷贝操作和函数传参。
所有像int. float. bool 、string以及 数组和struct这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:
package main import "fmt" //变量在内存中的存储方式 var num int = 10 var sum int = 20 func main() { //局部变量 var test1 = "hello" var test2 = "world" fmt.Println("num=", num) //调用内存地址使用& fmt.Println("num的内存地址是", &num) fmt.Println("sun的内存地址是", &sum) //调用函数中的变量 fmt.Println("test1的内存地址", &test1) fmt.Println(test2) } [Running] go run "f:\goProject\src\dev_code\day3\example1\main\main.go" num= 10 num的内存地址是 0xd3a258 //全局变量,为每一个值开辟一个存储空间 (栈) sun的内存地址是 0xd3a260 //为每一个值开辟一个存储空间 (栈) test1的内存地址 0xc000088220 //函数中的变量,变量的值存放位置(堆) world [Done] exited with code=0 in 0.619 seconds
当使用等号=将一个变量的值赋值给另- 个变量时,如: j = i,实际上是在内存中将i的值进行了拷贝:
package main import "fmt" func main() { var a = 10 var b = a fmt.Println("a的地址", &a) fmt.Println("b的地址", &b) } [Running] go run "f:\goProject\src\dev_code\day3\example2\main\main.go" a的地址 0xc0000aa058 //值类型的变量,是把a的值有复制了一份放在内存中 b的地址 0xc0000aa070 //值类型的变量,是把a的值有复制了一份放在内存中(两个地址不同的) [Done] exited with code=0 in 0.42 seconds
可以通过&i来获取变量i的内存地址,例如: 0X4840000040 (每次的地址都可能不一样) 。 值类型变量的值存储在堆中。 内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。
更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存, 指针、slice. map. chan都是引用类型。 一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置。