GoLang 学习笔记 – 变量

  GoLang变量名由字母、数字、下划线组成,其中首个字符不能为数字,其命名规则参考标识符。声明变量的一般形式是使用 var
关键字。
变量声明方式为:

var [变量名] [变量类型] 
// 例
var num int32

可以一次声明多个变量:

var num1, num2, num3 int

变量声明

  GoLang中有多声明变量的方式。
  第一种,只指定变量类型。如果没有初始化,则变量默认为零值(缺省值、默认值)。

var num int32
fmt.Println(num) // 取零值,输出 0

零值

GoLang 中变量的 默认值
缺省值
叫做零值

0
false
""

  第二种,根据初始值自行判定变量类型。

var num = 10
fmt.Println(num) // 取初始值,输出 10
fmt.Println(reflect.TypeOf(num)) // 输出 10
var str = "a"
fmt.Println(str) // 取初始值,输出 a
fmt.Println(reflect.TypeOf(str)) // 输出 string
// 使用reflect.TypeOf() 方法需要引入 reflect 包

  第三种,省略 var,用 :=
赋值运算符来声明。

num := 10  // 等价于 var num int = 10
fmt.Println(num) // 取初始值,输出 10

并行赋值

可以用用 :=
赋值运算符一次声明多个变量

num1, num2 := 10, 20

  右边的这些值以相同的顺序赋值给左边的变量,所以 num1 的值是 10, num2 的值是 20。这被称为 并行赋值
同时赋值
`。


注意 :=
是个声明语句, :=
左侧如果没有声明新的变量,就产生编译错误。

  如:

var num int
num := 10

  这时候会产生编译错误,因为 num 不是新的变量,它已经声明过了,它相当于同一个变量声明了两次。因为这等价于:

var num int
var num int
num = 10

  如果:

var num1 int
num1, num2 := 1, 2

  此时不会产生编译错误,因为 num2 之前并没有声明。此外,如果想要交换两个变量的值:

var a int = 1
var b int = 2
a, b = b, a // a 的值为 2,b的值为 1

  这样可以省去为了交换变量值而声明的第三个变量。 注意,待交换值的变量的类型必须相同,否则编译报错。

  可以使用因式分解关键字的写法声明变量,这种方式一般用于声明全局变量。

var (
    num1 int
    num2 int
)

空白标识符

_, b = 5, 7 // 5 被抛弃

  _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 GoLang中你必须使用所有被声明的变量 (等会会讲)
,但有时你并不需要使用从一个函数得到的所有返回值 (函数篇会讲)

并行赋值也被用于当一个函数返回多个返回值时获取返回结果
(函数篇会讲)*

未使用的变量

  GoLang 中所有已声明的变量必须使用,否则编译报错。

package main

import (
    "fmt"
)

func main() {
    var num = 10
    var str = "a"
    fmt.Println(str)
}

  这个程序会报错: num declared and not used
,意为变量 num
未使用。
  此外, GoLang 中所有已引入的包必须使用,否则编译报错。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var str = "a"
    fmt.Println(str) // 取初始值,输出 a
}

  这个程序会报错: imported and not used: "reflect"
,意为包 reflect
未使用。

默认类型

  使用 [变量名] := [变量值]
var [变量名] = [变量值]
方式声明变量的时候,Go 编译器会给予变量一个默认类型,下面几个变量的默认类型为基本数据类型:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var int_num = 10
    fmt.Println(reflect.TypeOf(int_num)) // 输出 int
    var float_num = 0.5
    fmt.Println(reflect.TypeOf(float_num)) // 输出 float64
    var string_str = "a"
    fmt.Println(reflect.TypeOf(string_str)) // 输出 string
    var byte_str = 'a'
    fmt.Println(reflect.TypeOf(byte_str)) // 输出 int32
}

  除非必要(开发文档规范),或是为了节省存储空间,否则建议在用 var [变量名] [变量类型] = [变量值]
方式声明变量时,按照默认类型来声明,可省去诸如类型转换等不必要的麻烦。

    以上内容均源于网络,并加上自己的实践和理解,如有错误的地方,请在评论区指正。