图片说明
图片说明
图片说明

1.变量的创建方法

Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。

Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字

变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。

声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可

1.1 一行声明一个变量

var <name> <type> //如果没有初始化,默认是零值

其中var是关键字,name是变量名,type是类型
图片说明

var name string = "编程时光"

在 Python 双引号与单引号等价,但在 Go 中双引号和单引号是不一样的,这里要一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符

若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,但是很多情况下,我们并不需要这么高的精度,这种情况下,推荐指定类型

var rate float32 = 0.89

1.2 多个变量一起声明

图片说明
图片说明

1.3 声明和初始化单个变量

图片说明
此方法声明变量只能用于函数内部

1.4 声明和初始化多个变量

name, age := "wangbm", 28 //:=的左侧必须是新的变量,如果没有声明新的变量,就产生编译错误

1.5 new函数声明一个指针变量

变量分为两种 普通变量 和 指针变量
普通变量,存放的是数据本身,而指针变量存放的是数据的地址。

package main

import "fmt"

func main()  {
    var age int = 28  //age是普通变量,存放的是内容28
    var ptr = &age  // &后面接变量名,表示取出该变量的内存地址,ptr是指针变量,存放变量age值的内存地址
    fmt.Println("age: ", age)
    fmt.Println("ptr: ", ptr)
}

使用表达式 new(Type) 将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为*Type。
图片说明
如下两种写法,可以说是等价的:

// 使用 new
func newInt() *int {
    return new(int)
}

// 使用传统的方式
func newInt() *int {
    var dummy int
    return &dummy
}

以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。
但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示
匿名变量,优点有三:
1、不分配内存,不占用内存空间
2、不需要你为命名无用的变量名而纠结
3、多次声明不会有任何问题

通常我们用匿名接收必须接收,但是又不会用到的值。

2、常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

const identifier [type] = value
const c_name1, c_name2 = value1, value2
const (
    Unknown = 0
    Female = 1
    Male = 2
)

常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过:

package main

import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)

func main(){
    println(a, b, c)
}

iota常量
这是特殊常量,是可以被编译器修改的常量
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)
iota 可以被用作枚举值:
图片说明
第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:
图片说明
实例:

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢复计数
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}
//output
0 1 2 ha ha 100 100 7 8
package main

import "fmt"
const (
    i=1<<iota
    j=3<<iota
    k
    l
)

func main() {
    fmt.Println("i=",i)
    fmt.Println("j=",j)
    fmt.Println("k=",k)
    fmt.Println("l=",l)
}
//output
i= 1
j= 6
k= 12
l= 24

图片说明
图片说明
图片说明