go基础:变量

138 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

变量声明

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。声明变量的一般形式是使用 var 关键字:

var identifier type

可以一次声明多个变量:

var identifier1, identifier2 type

示例:

package main
​
import "fmt"func main() {
    var a string = "James"
    fmt.Println(a)
​
    var b, c int = 1, 2
    fmt.Println(b, c)
}

如果声明了变量,并且指定变量类型,但是没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。

  • 数值类型(包括complex64/128)为 0

  • 布尔类型为 false

  • 字符串为 "" (空字符串)

  • 以下几种类型为 nil

    var a *int
    var a []int
    var a map[string] int
    var a chan int
    var a func(string) int
    var a error // error 是接口
    

示例:

package main
​
import "fmt"func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
    var a *int
    fmt.Println(a)
}

变量声明也可以不指定变量类型,编译器根据变量的值自行判定变量类型:

package main
​
import "fmt"func main() {
    var b = true  // bool
    fmt.Println(b)
    var str = "I am string"  // string
    fmt.Println(str)
    var i = 1024  // int
    fmt.Println(i)
}

简短格式声明

除 var 关键字外,还有一种声明变量的方式就是使用:=,与正常的声明不一样的是 := 是声明变量并赋值。

// = 使用必须使用先var声明例如:
var a
a = 100
//或
var b = 100
//或
var c int = 100
 
// := 是声明并赋值,并且系统自动推断类型,不需要var关键字
d := 100

:= 是用于未被定义过的变量,编译器自动进行右值推导定义并赋值,如果已经定义则编译报错

package main
​
import "fmt"func main() {
    var i = 1
    i := 2  // error
    fmt.Println(i)
}

但使用“:=”为多个变量赋值时,如果引入了至少一个新的变量,编译是可以通过的,如下例所示:

package main
​
import "fmt"func main() {
    var i = 1
    i, err := 2, false
    fmt.Println(i, err)
}

需要注意的是,简短模式(short variable declaration)有以下限制:

  • 定义变量,同时显式初始化。
  • 不能提供数据类型。
  • 只能用在函数内部。

因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。

多变量声明

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
// 和 python 很像,不需要显示声明类型,自动推断
var vname1, vname2, vname3 = v1, v2, v3 
// 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
vname1, vname2, vname3 := v1, v2, v3 
// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)

示例:

package main
​
var x, y int
var ( // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)
​
var c, d int = 1, 2
var e, f = 123, "hello"//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"func main() {
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}
​

匿名变量

在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。

匿名变量的特点是一个下画线“ ”,“ ”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。例如:

package main
​
import "fmt"func GetData() (int, int) {
    return 100, 200
}
func main() {
    a, _ := GetData()
    _, b := GetData()
    fmt.Println(a, b)
}

匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

常量

Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。

const pi = 3.14159 // 省略类型说明符,编译器可以根据变量的值来推断其类型
//显式类型定义: 
const a string = "abc"
//隐式类型定义: 
const b = "abc"
// 和变量声明一样,可以批量声明多个常量:
const (
    e  = 2.7182818
    pi = 3.1415926
)