变量

声明变量的一般形式是使用 var 关键字: var identifier type

命名采用小驼峰 numShips , startDate

如果需要外包使用,则首字母要大写 NumShips , StartDate

注意:他将变量的类型放在变量名称后面了

Go 可以根据值来自动推断变量类型,不过不建议

var a int = 15
var b string = "shuxiaoyuan"
var c bool = true
## 可以改写成如下形式
var (
	a int = 15
	b string = "shuxiaoyuan"
	c bool = true
)

数据类型

var v1 int            // 整型
var v2 string         // 字符串
var v3 bool           // 布尔型
var v4 [10]int        // 数组,数组元素类型为整型
var v5 struct {       // 结构体,成员变量 f 的类型为64位浮点型
    f float64
}
var v6 *int           // 指针,指向整型
var v7 map[string]int   // map(字典),key为字符串类型,value为整型
var v8 func(a int) int  // 函数,参数类型为整型,返回值类型为整型

当一个变量被声明之后,系统自动赋予它该类型的零值:

  • int 0
  • float 0.0
  • bool false
  • string ''
  • 指针 nil

作用域

在函数外声明,则认为是全局变量 在函数体内部声明,则认识是局部变量

简短声明语法 :=

当你在函数体内声明局部变量时,应使用简短声明语法 :=,如 a := 1

# 多变量定义和赋值
var a, b, c int
a, b, c = 5, 7, "abc"
# 直接交换变量值
a, b = b, a

空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

值类型和引用类型

所有像 int、 float、 bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,另外,像数组(第 7 章)和结构(第 10 章)这些复合类型也是值类型

在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 7 章),maps(第8 章)和 channel(第 13 章)。 被引用的变量会存储在堆中,以便进行垃圾回收,且比栈拥有更大的内存空间