Go语言const关键字理解

栏目: Go · 发布时间: 6年前

内容简介:const用来定义常量,所谓常量,就是在定义之后,其值不允许被修改。定义常量的格式是:const 常量名 [类型] = 值在定义常量时,可以不指定类型,golang编译器会自动推导出常量类型。定义字符串类型常量的写法:

const

const用来定义常量,所谓常量,就是在定义之后,其值不允许被修改。定义常量的格式是:

const 常量名 [类型] = 值

在定义常量时,可以不指定类型,golang编译器会自动推导出常量类型。定义字符串类型常量的写法:

const hi = "this is my first const"

or

const hi string = "this is my first const"

定义一个值为0的int类型常量写法

const num int = 0

or

const num = 0

在golang中有一个特殊的变量iota,这个变量只能与const搭配使用。iota的含义是初始化一个计数器,这个计数器的影响范围只能是const后括号作用域范围内的常量。如定义5个常量,值分别是0,1,2,3,4,写法如下:

package main

import (

"fmt"

)

func main() {

const (

NUM1 = iota

NUM2

NUM3

NUM4

NUM5

)

const (

A = iota

B

C

D

)

fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)

fmt.Println(A, B, C)

}

输出结果如下:

0 1 2 3 4

0 1 2

如下图:

Go语言const关键字理解

从上边的示例中可以发现NUM1被赋值成iota,从打印信息可以看出,iota的初始值是0。上边究竟发生了什么呢? 原来,iota把初始值0赋给NUM1后,自增1,此时iota等于1,随后将1赋值给常量NUM2,赋值完成后,iota又自增1,此时iota等于2,这个自增过程,只会出现在const后括号范围内,超过这个括号作为域。再次使用iota时,其初始值为0。从输出结果可知,常量A从0开始,可以证实这个观点。

在const后边的括号作用域内,iota是否真的在自增1呢?请看下边的示例代码:

package main

import (

"fmt"

)

func main() {

const (

NUM1 = iota

NUM2

NUM3 = iota

NUM4

NUM5

)

const (

A = iota

B

C

D

)

fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)

fmt.Println(A, B, C)

}

输出信息是:

0 1 2 3 4

0 1 2

iota会自动初始化括号作用域内iota前边的常量吗?答案是:不能

// 错误示例代码

package main

import (

"fmt"

)

func main() {

const (

NUM1

NUM2

NUM3 = iota

NUM4

NUM5

)

fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)

}

编译时产生的错误信息:

# command-line-arguments

./linuxidc.com.go:9:3: missing value in const declaration

./linuxidc.com.go:10:3: missing value in const declaration

./linuxidc.com.go:15:14: undefined: NUM1

./linuxidc.com.go:15:20: undefined: NUM2

如下图:

Go语言const关键字理解

从上边的示例代码中可以得知,iota并不会给括号作用域范围内,使用iota赋值的那个常量之前的常量赋值,只会给括号作用域内使用iota初始化的那个常量后边的所有常量自增1后赋值,结论有些绕口,以上边的示例代码为例,NUM3使用iota初始化,NUM4,NUM5在NUM3后边,所以被自动赋值,而NUM1,NUM2在NUM3前边,所以不会被自动赋值。

iota默认初始值为0,那么假如我们定义的常量初始值从100开始,那怎么来写呢?

package main

import (

"fmt"

)

func main() {

const (

NUM1 = iota + 100

NUM2

NUM3

NUM4

NUM5

)

fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)

}

输出结果:

100 101 102 103 104

Go语言const关键字理解

上边通过表达式的方式初始化NUM1,使得括号作用域内的常量从100开始递增。那么是不是表示iota的值从100开始自增1呢?答案是:不是的。当使用带iota的表达式初始化常量时,括号作用域内,后边的常量在初始化时,也会使用这个表达式进行初始化。相当于NUM2初始化表达式是:1+100,NUM2初始化的值是:2+100,以此类推。整个初始化过程中,依然是iota在自增1。

使用带iota表达式初始化常量时,括号作用域内能否使用多个表达式呢?答案是:可以,示例代码如下:

package main

import (

"fmt"

)

func main() {

const (

NUM1 = iota + 100

NUM2 = iota

NUM3 = iota + 10

NUM4

NUM5

)

fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)

}

输出信息是:

100 1 12 13 14

如下图:

Go语言const关键字理解

从上边的输出信息可以得知,在使用表达式初始化常量时,会使用离被初始化常量前边最近的那个表达式。如初始化NUM4时,使用的是:3+10,初始化NUM2时,使用的是iota,此时的iota值为1。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-11/155325.htm


以上所述就是小编给大家介绍的《Go语言const关键字理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Blog Design Solutions

Blog Design Solutions

Richard Rutter、Andy Budd、Simon Collison、Chris J Davis、Michael Heilemann、Phil Sherry、David Powers、John Oxton / friendsofED / 2006-2-16 / USD 39.99

Blogging has moved rapidly from being a craze to become a core feature of the Internetfrom individuals sharing their thoughts with the world via online diaries, through fans talking about their favori......一起来看看 《Blog Design Solutions》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具