首页 > 其他分享 >golang的特殊常量iota

golang的特殊常量iota

时间:2022-12-05 11:36:34浏览次数:47  
标签:const 常量 fmt mutexWoken golang mutexStarving mutexLocked iota

其实iota这个常量应该是编译器的常量,iota是一个编译器在编译过程中动态赋值。

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

下面代码,从golang标准库的mutex拿出来的,是一个互斥锁的结构体(关于Mutex不细说这里),里面定义有这样的常量。

例子1:

package main
import (
"fmt"
)
const (
mutexLocked = 1 << iota // mutex is locked
mutexWoken
mutexStarving
mutexWaiterShift = iota
)
func main() {
fmt.Printf("mutexLocked : %T = %v\n", mutexLocked, mutexLocked)
fmt.Printf("mutexWoken : %T = %v\n", mutexWoken, mutexWoken)
fmt.Printf("mutexStarving : %T = %v\n", mutexStarving, mutexStarving)
fmt.Printf("mutexWaiterShift : %T = %v\n", mutexWaiterShift, mutexWaiterShift)


}

golang的特殊常量iota_const关键字

让我不解的是,mutexLocked为1是可以理解的。数字1往左移动0位,也就是没有移动,数值保持不变。为什么mutexWoken=2?mutexStarving =4?。

接着我们再来看一个例子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)
}

golang的特殊常量iota_const关键字_02

d和e值相同,f和g值相同。从上面这个例子,可以得到这样一个结论。

在const声明中,变量缺省值时,默认使用上一行的常量赋值方式。e直接使用上一行的d值(ha)。


现在返回去看例子1.

mutexLocked = 1 << iota // mutex is locked
mutexWoken
mutexStarving
mutexWaiterShift = iota

mutexLocked=1<<iota

根据我们上面得到结论,

mutexWoken和mutexStarving同样使用1<<iota式子。特殊在于iota每一行的值自动iota++,mutexWoken=1<<1等于1*21=2,mutexStarving=1<<2等于1*22=4。mutexWaiterShift = iota,此时iota正好为3.



标签:const,常量,fmt,mutexWoken,golang,mutexStarving,mutexLocked,iota
From: https://blog.51cto.com/wyf1226/5911644

相关文章

  • golang的快速排序
    1、什么是快速排序:快速排序是一种分治策略的排序算法,本质上来看,快速排序是对冒泡排序的一种改进,属于交换类的排序算法。是由英国计算机科学家 TonyHoare​ 发明的,该算法......
  • Go-08 Golang中的切片
    packagemainimport"fmt"//Go语言中的切片/* 学习目标 1.为什么要使用切片 2.切片的定义 3.关于nil的认识 4.切片的循环遍历 5.基于数组定义切片 6.切片再切......
  • Golang反射修改变量值
    1.前言前面的随笔Golang反射获取变量类型和值分享了如何通过反射获取变量的类型和值,也就是Golang反射三大定律中的前两个,即从interface{}到反射对象和从反射对象到inter......
  • Golang抢占式调度
    Golang抢占式调度在1.12版本之前,go的调度器不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,会引发一些问题,如某些Goroutine可以长时间占用线程,造成......
  • Golang 协程调度器原理及GPM模型
    目录进程和线程内核级线程用户级线程协程协程与线程的关系N:11:1M:Ngoroutine旧版本goroutine调度器调度器的实现Goroutine调度器的GMP模型设计思想GPM结构组成GPM运行模型......
  • golang的希尔排序
    1、什么是希尔排序:插入排序的一种又称“缩小增量排序”(DiminishingIncrementSort),是直接插入排序算法​的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.......
  • 为什么int常量可以直接赋给byte,short,而double常量不能直接赋给float?
    对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动为我们补上一个(byte)(short)(char);类似自动类型转换,如果超出了自身的数据取值......
  • Golang文件服务器
    主调函数,设置路由表packagemainimport( "fmt" "net/http" "store/handler")funcmain(){ http.HandleFunc("/file/upload",handler.UploadHandler) http.Ha......
  • Golang反射获得变量类型和值
    1.什么是反射反射是程序在运行期间获取变量的类型和值、或者执行变量的方法的能力。Golang反射包中有两对非常重要的函数和类型,两个函数分别是:reflect.TypeOf能获取类......
  • golang rang 字符串
    golang遍历字符串,有多种方式:``点击查看代码 //字符串,把字符串起来 s:="中国人,zgr" forpos,char:=ranges{ //range是按照字符来遍历,返回字符出现的位置......