Logo
活死人の行知路

Go语言基础(二):常量的定义与使用


📅 | 📝 541 字
#go

1常量

package main

import "fmt"

func main() {
	// 1. 常量的数据类型可以是数字,字符串,布尔
	// 2. 不曾使用的常量,编译时不会报错,变量会报错

	// 常量定义
	// 1. 省略类型
	// 2. 定义多个常量(类型相同)
	// 3. 定义多个常量(类型不同)
	// 4. 定义多个常量,省略类型
	const aaa = 1
	const (
		bbb             = 1
		ccc             = 1
		ddd, eee        = "ddd", "eee"
		fff, ggg        = 100, "ggg"
		hhh      int    = 10
		iii      string = "iii"
		//j string // 常量不能只声明不赋值
	)

	// 常量组如不指定类型和初始化值,该类型和值和上一行的类型一致
	const (
		x int = 16
		y
		s = "abc"
		z
	)
	fmt.Println(x, y, s, z)                 // 16 16 abc abc
	fmt.Printf("%T %T %T %T\n", x, y, s, z) // int int string string

	// Go没有枚举类型,可以通过常量和枚举关键字实现枚举效果,枚举关键字:iota
	// iota是常量,常用作常量计数器,枚举,只和行有关
	// 几十个计数器,是第几个常量,从0开始
	const (
		a    = iota       //0
		b                 //1
		c                 //2
		d    = "ha"       //独立值,07-iota += 1 = 3
		e                 //"ha"   07-iota += 1 = 4
		f    = 100        //100    07-iota +=1 = 5
		g                 //100    07-iota +=1 = 6
		h, i = iota, iota //7, 7  07-iota + 1 = 7
		j    = iota       //8      恢复计数 ==> 8
		//k                 //9
		//l                 //10
	)
	fmt.Println(a, b, c, d, e, f, g, h, i, j) // 0 1 2 ha ha 100 100 7 7 8 9 10

	const (
		aa = iota // 0
		bb = iota // 1
		cc = iota // 2
	)
	fmt.Println(aa, bb, cc) // 0 1 2

	// 下面的这个要注意下,B1值是200
	const (
		A1 = (iota + 1) * 100 // 100
		B1                    // 200
		C1                    // 300
		D1 = 10               //10
		E1 = "hello"          // hello
		F1                    // hello
		G1 = iota             // 6
	)
	fmt.Println(A1, B1, C1, D1, E1, F1, G1) // 100 200 300 10 hello hello 6
}

常量是一个简单值的标识符,在程序运行时,不会被修改的量。 显式类型定义: const b string = “abc” 隐式类型定义: const b = “abc”

package main

import “fmt”

func main() { const LENGTH int = 10 const WIDTH int = 5
var area int const a, b, c = 1, false, “str” //多重赋值

area = LENGTH * WIDTH fmt.Printf(“面积为 : %d”, area) fmt.Println(a, b, c)
} 常量可以作为枚举,常量组 const ( Unknown = 0 Female = 1 Male = 2 ) 常量组合python中元组类似,一旦定义不能被修改 gender_tuple = (“male”, “female”) gender_tuple[0] = “unknown” # 这一行会报错,不支持修改 go 常量组中不能重复定义,下面第3,5行会报错,提示 'male' redeclared in this block const ( unknown = 0 male = 1 female = 2 male = 3 )

常量组中如不指定类型和初始化值,则与上一行非空常量右值相同,该类型和值与上一行的类型一致 package main

import ( “fmt” )

func main() { const ( x uint16 = 16 y s = “abc” z ) fmt.Printf("%T,%v\n", y, y) // uint16,16 fmt.Printf("%T,%v\n", z, z) // string,abc } 常量的注意事项: ● 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型 ● 不曾使用的常量,在编译的时候,是不会报错的,但是变量不行,变量一旦定义就必须使用 ● 显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量可以是不同的类型值 iota iota,特殊常量,可以认为是一个可以被编译器修改的常量 iota 可以被用作枚举值: const ( a = iota // 0 b = iota // 1 c = iota // 2 ) 第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式: const ( a = iota b c ) 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,i=iota j = iota //7,恢复计数 k //8 ) fmt.Println(a, b, c, d, e, f, g, h, i, j, k) // 0 1 2 ha ha 100 100 7 8 }

如果中断iota自增,则必须显式恢复。且后续自增值按行序递增 自增默认是int类型,可以自行进行显示指定类型 数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址

使用iota能简化定义,在定义枚举时很有用。

每次 const 出现时,都会让 iota 初始化为0. const a = iota // a=0 const ( b = iota //b=0 c //c=1 相当于c=iota )