[golang note] 变量常量

时间:2022-09-13 16:57:19

变量


• 变量声明

        golang变量声明的关键字为var

        golang变量声明时类型信息放置在变量名之后

▶ 单个变量声明

▪ 语法如下

var name type

▪ 示例如下

var v1 int             // 整形
var v2 *int            // 指针
var v3 string          // 字符串
var v4 []int           // 数组切片
var v5 [10]int         // 数组
var v6 map[string]int  // map
var v8 func(a int) int // 函数
var v7 struct {        // 结构体
    f int
}

▶ 多个变量声明

▪ 语法如下

var (
    name1 type1
    name2 type2
    name3 type3
    ...
)

▪ 示例如下

var (
    v1 int             // 整形
    v2 *int            // 指针
    v3 string          // 字符串
    v4 []int           // 数组切片
    v5 [10]int         // 数组
    v6 map[string]int  // map
    v8 func(a int) int // 函数
    v7 struct {        // 结构体
        f int } )

• 变量声明时初始化

▶ 第一种方式

▪ 语法如下

var name type = value

var (
    name1 type1 = value1
    name2 type2 = value2
    name3 type3 = value3
    ...
)

▪ 示例如下

var v1 int = 10
var (
    v2 int    = 20
    v3 string = "abc"
)

▶ 第二种方式

▪ 语法如下

var name = value // 编译器可以自动推导出变量的类型

▪ 示例如下

var v1 = 10
var (
    v2 = 20
    v3 = "abc"
)

▶ 第三种方式

        golang引入了一个c和c++中没有的符号:=,用于明确表明同时进行变量声明和初始化的工作

        出现在:=左边的变量不应该是已声明过,否则编译器将给出错误:no new variables on left side of :=。

▪ 语法如下

name := value // 编译器可以自动推导出变量的类型

▪ 示例如下

v1 := 10
v2 := 20
v3 := "abc"

• 变量赋值

▶ 多元赋值

▪ 语法如下

variable1, variable2, ... variablen = value1, value2, ... valuen

▪ 示例如下

var v1, v2 int v1, v2 = 10, 20

       多元赋值支持不引入中间变量来交换两个变量的值。

v1 := 10
v2 := 20
v1, v2 = v2, v1

• 变量包可见性

        golang中,以大写字母开头的变量在包外可见,否则为包内私有。

       例如下面golearning工程下有两个包:main包和math包。其中src/math/math.go中定义了一个Pi变量,在src/main/main.go中使用该变量:

       [golang note] 变量常量

// math.go
package math

var Pi float64 = 3.14159265358979323846

// main.go
package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Pi)
}

       如果将Pi改为小写pi,那么编译器将给出错误:

       [golang note] 变量常量

常量


        golang中,常量是指编译期间运算得出且不可改变的值

• 常量定义

        golang常量定义的关键字为const

// 定义单个常量
const Pi float64 = 3.14159265358979323846

// 定义多个常量
const (
    Size int64 = 1024
    Eof  int64 = -1
)

        golang常量定义可以限定常量类型,也可以不限定。如果常量定义时没有限定类型,那么它与字面常量一样,是一个无类型常量

// 定义单个常量
const Pi = 3.14159265358979323846 // 无类型浮点常量

// 定义多个常量
const (
    Size = 1024 // 无类型整型常量
    Eof  = -1   // 无类型整型常量
)

        golang常量定义的右值可以是一个在编译期运算的常量表达式,这与c语言中宏的性质是一样的。

const Mask = 1 << 3            // correct
const Path = os.Getenv("PATH") // incorrect : const initializer os.Getenv("PATH") is not a constant

• 特殊常量

▶ 字面常量

        字面常量(literal),是指程序中硬编码的常量

        golang中字面常量是无类型的,只要该字面常量在相应类型的值域范围内,就可作为该类型的常量。

-12             // 整数类型的常量 3.14159265358979323846  // 浮点类型的常量 3.2+12i           // 复数类型的常量 true             // 布尔类型的常量 "foo"            // 字符串常量

▶ 预定义常量

        golang预定义了这些常量:truefalseiota

▪ true和false

        预定义常量true和false所属的基础类型为bool。

package main

import (
    "fmt"
    "reflect" ) func main() {
    const Mask = true
    fmt.Println(reflect.TypeOf(Mask)) // bool
}

▪ iota

        预定义常量iota所属的基础类型为int。

        iota可认为是一个可被编译器修改的常量:在每一个const关键字出现时值重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。

const (
    a = iota // 0
    b = iota // 1
    c = iota // 2
)

const (
    d = 1 << iota // 1
    e = 1 << iota // 2
    f = 1 << iota // 4
)

const (
    g = 42 * iota // 0
    h = 42 * iota // 42
    i = 42 * iota // 84
)

        如果两个const赋值语句的表达式一样,那么可以省略后一个赋值表达式。

const (
    a = iota // 0
    b        // 1
    c        // 2
)

const (
    d = 1 << iota // 1
    e             // 2
    f             // 4
)

const (
    g = 42 * iota // 0
    h             // 42
    i             // 84
)

▶ 枚举

        golang并不支持众多其他语言中支持的enum关键字。

        在golang中定义枚举值的方式:在const后跟一对圆括号的方式定义一组常量。

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    NumberOfDays
)

• 常量包可见性

        golang中,以大写字母开头的常量在包外可见,否则为包内私有。