5.常量与变量

予早 2024-12-11 01:16:19
Categories: Tags:

声明、赋值、使用

源代码中变量只声明不赋值,编译器会自动使用默认值

package main

import (
    "fmt"
)

func main() {
    // 声明
    var v1 int8
    fmt.Println(v1) // 0
    // 赋值
    v1 = 10
    // 使用
    fmt.Println(v1) // 10
}

单变量声明、多变量声明

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    //单变量声明的三种方式
    var v1 int8 = 120
    fmt.Println(v1)
    fmt.Printf("%T\n", v1)
    fmt.Println(unsafe.Sizeof(v1))

    var v3 = "120"
    fmt.Println(v3)
    fmt.Printf("%T\n", v3)
    fmt.Println(unsafe.Sizeof(v3))

    v2 := 1.20
    fmt.Println(v2)
    fmt.Printf("%T\n", v2)
    fmt.Println(unsafe.Sizeof(v2))

    //多变量声明
    var (
        v4 = 1
        v5 = 2
        v6 = 4
    )
    //var v7 = 1, v8 = 2, v9 = 3 不支持
    var v7, v8, v9 int = 1, 2, 3
    v10, v11, v12 := 1, 2, 3
    fmt.Println(v4, v5, v6, v7, v8, v9, v10, v11, v12)
}

在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以“名字 := 表达式”形式声明变量,变量的类型根据表达式来自动推导。请记住“:=”是一个变量声明语句,而“=”是一个变量赋值操作。简短变量声明左边的变量可能并不是全部都是刚刚声明的。如果有一些已经在相同的词法域声明过了(§2.7),那么简短变量声明语句对这些已经声明过的变量就只有赋值行为了。简短变量声明语句中必须至少要声明一个新的变量

简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。

全局变量与局部变量

注意:全局变量是允许不使用的,因为可能是提供给其他包使用的

变量作用域,{}即为作用域,包括包、函数、一般{}等

package main

import "fmt"

// 全局变量
var v0 = 12

func main() {
    var v1 int //局部变量
    v1 = 18
    fmt.Println("age =", v1)
}

// 全局变量
var (
    v2 = 1
    v3 = 1
)

常变量

package main

import "fmt"

func main() {
    const (
        a = 0
        b = 1
        c = 2
    )
    fmt.Println(a, b, c)
}

善用常量计数器itoa,更GO式的写法,itoa意思是 int to acsII

package main

import "fmt"

func main() {
    const (
        a = iota
        b
        c
    )
    fmt.Println(a, b, c)
}

itoa

package main

import "fmt"

func main() {
    const (
        a    = iota
        b, c = iota, iota
    )
    fmt.Println(a, b, c)
}
package main

import "fmt"

func main() {
    const (
        a    = iota
        b, c = iota, iota
    )
    fmt.Println(a, b, c)
    const (
        d = iota
        e = iota
        f = iota
    )
    fmt.Println(d, e, f)

}

插值

package main

import "fmt"

func main() {
    const (
        a = iota
        // 空行不会影响计数
        _ // _ 可以占用一个计数位置
        b
        c = 100  // 常量值可以占用一个计数位置
        e        // 常量值后依然为空则同为100
        f = iota // 常量值后继续计数器需要重新写上itoa
    )
    fmt.Println(a, b, c, e, f)

}

使用公式递推计算常量值

package main

import "fmt"

func main() {
    const (
        _  = iota
        KM = 1 << (10 * iota)
        MB
        GB
        TB
        PB
    )
    fmt.Println(KM, MB, GB, TB, PB)

}

内置变量

// nil 是一个预定义标识符,代表pointer、channel、func、interface、map、slice类型的 zero value

var nil Type // Type 必须是 pointer、channel、func、interface、map、slice 之一