
列举,展示是列举类型一种次要的数据圭表类型,由一组键值对构成 ,圭表但凡用来在编程言语中充当常量的体解标识符。在主风行编程言语如 c 、释注 java 等,展示都有原生支撑。列举类型在 go 中,圭表大年夜师却找不到 enum 或此外直接用来声明列举圭表类型的体解关头字。从熟谙此外编程言语的释注斥地者转用 go 编程 ,刚最早会斗劲难领受这类气候。展示真实,列举类型假定你看到若安在 go 中展示列举圭表类型时,圭表大年夜大年夜约会感应感染到 go 言语筹划者对精练性、体解问题思虑的释注深度,是一样往常资浅工程师没法比照的。
真实,在 go 言语筹划者的眼里 ,enum 本质是常量,为甚么要多余一个关头字呢?在 go 只是没有 enum 关头字罢了 ,其默示列举的编制,与此外措离去无太除夜分辨 。上面来看看假定在 go 中展示列举 。
进修 、独霸一门言语 ,是进修、邃晓言语本身的筹划哲学,同时也会感应感染到筹划者的性格特点。
为了上面解释注解利便,这里独霸 go modules 的编制先创建一个复杂工程 。
~/Projects/go/examples ➜ mkdir enum ~/Projects/go/examples ➜ cd enum ~/Projects/go/examples/enum ➜ go mod init enum go: creating new go.mod: module enum ~/Projects/go/examples/enum ➜ touch enum.go
const + iota
以 启动、运转中、停止 这三个外形为例 ,独霸 const 关头来声明一系列的常量值。在 enum.go 中写上以下内容 :
package main import "fmt" const ( Running int = iota Pending Stopped ) func main() { fmt.Println("State running: ", Running) fmt.Println("State pending: ", Pending) fmt.Println("State Stoped: ", Stopped) } 保管并运转,可以掉落踪掉落踪以下下场 ,
~/Projects/go/examples/enum ➜ go run enum.go State running: 0 State pending: 1 State Stoped: 2
在声明产生发火了甚么之前,我们先看来一件对象,iota 。比照于 c、java ,go 中供给了一个常量计数器,iota ,它独霸在声明常量时为常量延续赋值 。
比如这个例子,
const ( a int = iota // a = 0 b int = iota // b = 1 c int = iota // c = 2 ) const d int = iota // d = 0
在一个 const 声明块中 ,iota 的初始值为 0,每声明一个变量,自增 1 。以上的代码可以简化成:
const ( a int = iota // a = 0 b // b = 1 c // c = 2 ) const d int = iota // d = 0
想象一下,假定斯时有 50 或 100 个常量数 ,在 c 和 java 言语中写出来会是甚么气候。
关于 iota ,有更多的具体的身手(比如跳数),具体请看官方定义 iota。
经由过程独霸 const 来定义延续串的常量 ,并借助 iota 常量计数器 ,来疾速的为数值圭表类型的常量延续赋值 ,特别很是利便 。当然没有了 enum 关头字 ,在这类气候下创作创造,是多余的,列举本质上就是常量的组合。
当然,你可独霸以***例 ,来更接近此外言语的 enum ,
// enum.go ... type State int const ( Running State = iota Pending Stopped ) ...
把一组常量值 ,独霸一个圭表类型别号包裹起来 ,是不是是更像此外言语中的 enum { } 定义了呢 ?
你还可以将上面的例子改成 :
// enum.go ... type State int const ( Running State = iota Pending Stopped ) func (s State) String() string { switch s { case Running: return "Running" case Pending: return "Pending" case Stopped: return "Stopped" default: return "Unknown" } } ... 为定义的列举圭表类型加上 String 函数,运转下场以下:
~/Projects/go/examples/enum ➜ go run enum.go State running: Running State pending: Pending State Stoped: Stopped
是不是是很魔幻,思路一下又坦荡一些 ,长定见了。把理论的值与打印字符离开 ,一样往常言语筹划者不会想到。看到这里 ,有没有这类的感应感染,go 言语的筹划者真实不是偷懒 ,而是为了可以偷懒想了良多 、做了良多。
到此这篇关于Golang展示列举圭表类型的具体解释注解的文章就引见到这了,更多相干Golang 列举圭表类型内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!