go语言的iota

网上看了看iota.反正是没看大懂.
给个例子自己悟吧

package main
import (
   "fmt"
)
const (
   TestMin = -1
   TestA
   TestB = iota
   TestC
)

func main() {
   fmt.Printf("TestMin:%d\n", TestMin)
   fmt.Printf("TestA:%d\n", TestA)
   fmt.Printf("TestB:%d\n", TestB)
   fmt.Printf("TestC:%d\n", TestC)
}

输出结果

TestMin:-1
TestA:-1
TestB:2
TestC:3

是不是大概有数了
再来看一个:

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

k等于12,l等于24是如何得出来的呢?

i=1<<iota
j=3<<iota
k
l

也就是

i=1<<0
j=3<<1
k=3<<2
l=3<<3

iota每出现一次,自动加1;而前面的操作数如果不指定,默认使用上一个的,在这里是3
再来个

package main
import (
    "fmt"
)
type ByteSize float64

const (
    _           = iota                   // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota) // 1 << (10*1)
    MB                                   // 1 << (10*2)
    GB                                   // 1 << (10*3)
    TB                                   // 1 << (10*4)
    PB                                   // 1 << (10*5)
    EB                                   // 1 << (10*6)
    ZB                                   // 1 << (10*7)
    YB                                   // 1 << (10*8)
)
func main() {
  fmt.Println("KB =",KB)
  fmt.Println("MB =", MB)
  fmt.Println("GB =", GB)
  fmt.Println("TB=", TB)
  fmt.Println("PB=", PB)
  fmt.Println("EB=", EB)
  fmt.Println("ZB=", ZB)
  fmt.Println("YB=", YB)
}

func (b ByteSize) String() string {
    switch {
    case b >= YB:
        return fmt.Sprintf("%.2fYB", b/YB)
    case b >= ZB:
        return fmt.Sprintf("%.2fZB", b/ZB)
    case b >= EB:
        return fmt.Sprintf("%.2fEB", b/EB)
    case b >= PB:
        return fmt.Sprintf("%.2fPB", b/PB)
    case b >= TB:
        return fmt.Sprintf("%.2fTB", b/TB)
    case b >= GB:
        return fmt.Sprintf("%.2fGB", b/GB)
    case b >= MB:
        return fmt.Sprintf("%.2fMB", b/MB)
    case b >= KB:
        return fmt.Sprintf("%.2fKB", b/KB)
    }
    return fmt.Sprintf("%.2fB", b)
}

输出撒?

KB = 1024
MB = 1.048576e+06
GB = 1.073741824e+09
TB= 1.099511627776e+12
PB= 1.125899906842624e+15
EB= 1.152921504606847e+18
ZB= 1.1805916207174113e+21
YB= 1.2089258196146292e+24
//上面是不增加ByteSize方法时输出的
KB = 1.00KB
MB = 1.00MB
GB = 1.00GB
TB= 1.00TB
PB= 1.00PB
EB= 1.00EB
ZB= 1.00ZB
YB= 1.00YB
最后修改时间为:2017 年 10 月 10 日 12 时 43 分 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论