Golang常量实例分析教程

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

内容简介:整理了一篇Golang常量实例分析教程,希望对大家有所帮助。1.Golang常量的定义格式:const identifier [type] = value

整理了一篇Golang常量实例分析教程,希望对大家有所帮助。

1.Golang常量的定义格式:

const identifier [type] = value

你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

  • 显式类型定义: const b string = "abc"
  • 隐式类型定义: const b = "abc"

多个相同类型的声明可以简写为:

const c_name1, c_name2 = value1, value2

以下实例演示了常量的应用:

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)

println()

println(a, b, c) 

}

以上实例运行结果为:

面积为 : 50

1 false str

Golang常量实例分析教程

常量还可以用作枚举:

const (

Unknown = 0

Female = 1

Male = 2

)

字 0、1 和 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)

}

以上实例运行结果为:

abc 3 16

Golang常量实例分析教程

iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。

iota 可以被用作枚举值:

const (

a = iota

b = iota

c = iota

)

第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

const (

a = iota

b

c

)

iota 用法

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)

}

以上实例运行结果为:

0 1 2 ha ha 100 100 7 8

Golang常量实例分析教程

再看个有趣的的 iota 实例:

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)

}

以上实例运行结果为:

i= 1

j= 6

k= 12

l= 24

Golang常量实例分析教程

iota 表示从 0 开始自动加 1,所以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,这没问题,关键在 k 和 l,从输出结果看 k=3<<2,l=3<<3。

简单表述:

i=1:左移 0 位,不变仍为 1;j=3:左移 1 位,变为二进制 110, 即 6; k=3:左移 2 位,变为二进制 1100, 即 12; l=3:左移 3 位,变为二进制 11000,即 24。

篇笔记

a = "hello"

unsafe.Sizeof(a)

1.

输出结果为:16

字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是 8 个字节,所以字符串类型大小为 16 个字节。

2.常量值必须是编译期可确定的数字、字符串、布尔值。

const x, y int = 1, 2 // 多常量初始化

const s = "Hello, World!" // 类型推断

const ( // 常量组

a, b = 10, 100

c bool = false

)

func main() {

const x = "xxx" // 未使⽤用局部常量不会引发编译错误。

}

在常量组中,如不提供类型和初始化值,那么视作与上⼀一常量相同。

const (

s = "abc"

x // x = "abc"

)

常量值还可以是 len、cap、unsafe.Sizeof 等编译期可确定结果的函数返回值。

const (

a = "abc"

b = len(a)

c = unsafe.Sizeof(b)

)

如果常量类型⾜足以存储初始化值,那么不会引发溢出错误。

const (

a byte = 100 // int to byte

b int = 1e20 // float64 to int, overflows

)

枚举

关键字 iota 定义常量组中从 0 开始按⾏行计数的⾃自增枚举值。

const (

Sunday = iota // 0

Monday // 1,通常省略后续⾏行表达式。

Tuesday // 2

Wednesday // 3

Thursday // 4

Friday // 5

Saturday // 6

)

const (

_ = iota // iota = 0

KB int64 = 1 << (10 * iota) // iota = 1

MB // 与 KB 表达式相同,但 iota = 2

GB

TB

)

在同⼀一常量组中,可以提供多个 iota,它们各⾃自增⻓长。

const (

A, B = iota, iota << 10 // 0, 0 << 10

C, D // 1, 1 << 10

)

如果 iota ⾃自增被打断,须显式恢复。

const (

A = iota // 0

B // 1

C = "c" // c

D // c,与上⼀一⾏行相同。

E = iota // 4,显式恢复。注意计数包含了 C、D 两⾏行。

F // 5

)

可通过⾃自定义类型来实现枚举类型限制。

type Color int

const (

Black Color = iota

Red

Blue

)

func test(c Color) {}

func main() {

c := Black

test(c)

x := 1

test(x) // Error: cannot use x (type int) as type Color in function argument

test(1) // 常量会被编译器⾃自动转换。

}

在go语言中,没有直接支持枚举的关键字,也就造成go没有直接枚举的功能。但是go提供另一种方法来实现枚举,那就是const+iota

package main

import(

"fmt"

)

type State int

const (

Running State = iota

Stopped

Rebooting

Terminated

)

func (this State) String()string{

switch this {

case Running :

return "Running"

case Stopped :

return "Stopped"

default :

return "Unknow"

}

}

func main(){

state := Stopped

fmt.Println("state", state)

}

运行...

state Stopped

Golang常量实例分析教程

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

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


以上所述就是小编给大家介绍的《Golang常量实例分析教程》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具