变量
声明变量的一般形式是使用关键字 var,例如:
var indentifier type
例如:
var a int
var b bool
var str string
或者
var (
a int
b bool
str string
)
当一个变量被声明后,系统自动对它进行赋值:
int 为 0
float 为 0.0
bool 为 false
string 为 空字符串
指针 为 nil
所有的内存在Go中都是经过初始化的,比如:
定义一个int类型的变量power,如果我们不给变量power指定值,Go会为变量power分配默认值0。
var power int // 定义power为0
var power int = 9000 // 赋值power为9000
对于变量的赋值而言,这个写法过于冗长,Go提供了一个短变量声明运算符 :=
power := 9000
短变量声明运算符可以自动识别变量类型,但是作为一个声明运算符,不能使用 := 对相同的变量ongoing在同一个作用域中声明两次,倘若在声明之后需要进行对变量的值的修改,需要使用 = 。
多变量赋值,例如:
name, power := "google.com", 8080
注:Go是一个简洁的代码,它不能存在未被使用的变量,因此如果声明的变量或者引入的包未被使用,它会报错,某些IDE会在插件的帮助是直接自动删除这些未被使用的变量和包。
值类型
值类型包含int、float、bool、string、数组和结构等,使用这些类型的变量直接指向内存中的值。
使用等号 = 将一个变量的值赋值给另外一个变量时,如j = i ,实际上是在内存中将 i 的值进行了拷贝。
通过使用 & 可以获取变量的内存地址,值类型的变量的值存储在栈中。内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。
引用类型
复杂的数据通常会使用较多个内存地址,这些数据一般使用引用类型保存。
引用类型包含指针、slices、maps和channel。被引用的类型存储在堆中,以便垃圾回收, 并且比栈拥有更大的内存空间
一个引用类型的变量r1存储的是r1的值所在的内存地址,或内存地址中第一个字所在的位置。这个内存地址被称为指针,这个指针实际上也存在了另外的某一个地址中。
例如:
package main
import (
"fmt"
)
func main() {
var r1 int // 定义一个int字符,&r1为其地址
var r2 *int // 定义一个指针类型r2,*r2为其值
r1 = 2 // 定义r1的值为2
r2 = &r1 // 定义r2是指向r1的指针
fmt.Println(r1, &r1) // 输出 2 0xc000014098
fmt.Println(r2, *r2) // 输出 0xc000014098 2
}
注:&r1和r2的地址指向同一个地址,另外输出的地址,各个电脑的内存储存位置不一致,所以输出也不一定一样
有疑问加站长微信联系(非本文作者)