欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文搞懂Golang中iota的用法和原理

 更新時(shí)間:2022年08月30日 08:18:12   作者:yi個(gè)俗人  
我們知道iota是go語(yǔ)言的常量計(jì)數(shù)器,本文嘗試全面總結(jié)其使用用法以及其實(shí)現(xiàn)原理,需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有所幫助

前言

我們知道iota是go語(yǔ)言的常量計(jì)數(shù)器,只能在常量的const表達(dá)式中使用,在const關(guān)鍵字出現(xiàn)的時(shí)將被重置為0,const中每新增一行常量聲明iota值自增1(iota可以理解為const語(yǔ)句塊中的行索引),使用iota可以簡(jiǎn)化常量的定義,但其規(guī)則必須要牢牢掌握,否則在我們開(kāi)發(fā)中可能會(huì)造成誤解,本文嘗試全面總結(jié)其使用用法以及其實(shí)現(xiàn)原理,需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助。

iota的使用

iota在const關(guān)鍵字出現(xiàn)時(shí)將被重置為0

iota只能在常量的表達(dá)式中使用,iotaconst關(guān)鍵字出現(xiàn)時(shí)將被重置為0。不同const定義塊互不干擾。

//const關(guān)鍵字出現(xiàn)時(shí)將被重置為0
const (
    a = iota  //0
    b         //1
)
//不同const定義塊互不干擾
const (
    c = iota //0
)

按行計(jì)數(shù)

const每新增一行常量聲明,iota計(jì)數(shù)一次,可以當(dāng)做const語(yǔ)句中的索引,常用于定義枚舉數(shù)據(jù)。

const (
    n1 = iota //0
    n2 		  //1
    n3 		  //2
    n4 		  //3
)

所有注釋行和空行全部忽略

所有注釋行和空行在編譯時(shí)期首先會(huì)被清除,所以空行不計(jì)數(shù)。

const (
    a = iota  //0
    
    b		  //1
    
    //此行是注釋
    c         //2
)

跳值占位

如果某個(gè)值不需要,可以使用占位 “_”,它不是空行,會(huì)進(jìn)行計(jì)數(shù),起到跳值作用。

const (
    a = iota //0
    _
    b        //2
)

多個(gè)iota

同一const塊出現(xiàn)多個(gè)iota,只會(huì)按照行數(shù)計(jì)數(shù),不會(huì)重新計(jì)數(shù)。

const (
    a = iota     // a=0
    b = iota     // b=1
    c = iota     // c=2
  )

一行多個(gè)iota

一行多個(gè)iota,分別計(jì)數(shù)。

const (
    a, b = iota, iota // a=0,b=0
    c, d              // c=1,d=1
)

首行插隊(duì)

開(kāi)頭插隊(duì)會(huì)進(jìn)行計(jì)數(shù)。

const (
    a = 100 //  a=100
    b = iota // b=1
    c = iota // c=2
    d        // d=3
)

中間插隊(duì)

中間插隊(duì)會(huì)進(jìn)行計(jì)數(shù)。

const (
    a = iota // a=0
    b = 100  // b=100
    c = iota // c=2
    d        // d=3
)

沒(méi)有表達(dá)式的常量定義復(fù)用上一行的表達(dá)式

const (
   a = iota       //  iota = 0 
   b = 1 + iota  // iota = 1
   c           // iota = 2
)

實(shí)現(xiàn)原理

iota定義

iota 源碼在 Go 語(yǔ)言代碼庫(kù)中的定義位于內(nèi)建文件 go/src/builtin/builtin.go 中:

const iota = 0 // Untyped int.iota

在這里聲明了一個(gè)常量標(biāo)識(shí)符,它的值是0;iota只是一個(gè)簡(jiǎn)單的整數(shù)0,為什么能作為常量計(jì)數(shù)器進(jìn)行自增的,我們?cè)倏匆幌耤onst的實(shí)現(xiàn)。

const

const 塊中每一行在 Go 中使用 spec 數(shù)據(jù)結(jié)構(gòu)描述, spec 聲明如下:

ValueSpec struct {
 Doc *CommentGroup // associated documentation; or nil
 Names []*Ident // value names (len(Names) > 0)
 Type Expr // value type; or nil
 Values []Expr // initial values; or nil
 Comment *CommentGroup // line comments; or nil
}

在這個(gè)結(jié)構(gòu)體中有一個(gè)切片 ValueSpec.Names,此切片中保存了一行中定義的常量,如果一行定義N個(gè)常量,那么 ValueSpec.Names 切片長(zhǎng)度即為N。

const塊實(shí)際上是spec類(lèi)型的切片,用于表示const中的多行。

編譯期間構(gòu)造常量時(shí)的偽算法如下:

for iota, spec := range ValueSpecs {
 for i, name := range spec.Names {
 obj := NewConst(name, iota...) //此處將iota傳入,用于構(gòu)造常量
 ...
 }
}

iota實(shí)際上是遍歷const塊的索引,每行中即便多次使用iota,其值也不會(huì)遞增。

到此這篇關(guān)于一文搞懂Golang中iota的用法和原理的文章就介紹到這了,更多相關(guān)Golang iota內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLang bytes.Buffer基礎(chǔ)使用方法詳解

    GoLang bytes.Buffer基礎(chǔ)使用方法詳解

    Go標(biāo)準(zhǔn)庫(kù)中的bytes.Buffer(下文用Buffer表示)類(lèi)似于一個(gè)FIFO的隊(duì)列,它是一個(gè)流式字節(jié)緩沖區(qū),我們可以持續(xù)向Buffer尾部寫(xiě)入數(shù)據(jù),從Buffer頭部讀取數(shù)據(jù)。當(dāng)Buffer內(nèi)部空間不足以滿(mǎn)足寫(xiě)入數(shù)據(jù)的大小時(shí),會(huì)自動(dòng)擴(kuò)容
    2023-03-03
  • Go語(yǔ)言函數(shù)學(xué)習(xí)教程

    Go語(yǔ)言函數(shù)學(xué)習(xí)教程

    這篇文章主要介紹了Go語(yǔ)言函數(shù)基本用法,結(jié)合實(shí)例形式分析了Go語(yǔ)言函數(shù)的格式、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • 一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    本文就來(lái)詳細(xì)說(shuō)說(shuō)為什么說(shuō)?接口本質(zhì)是一種自定義類(lèi)型,以及這種自定義類(lèi)型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • golang針對(duì)map的判斷,刪除操作示例

    golang針對(duì)map的判斷,刪除操作示例

    這篇文章主要介紹了golang針對(duì)map的判斷,刪除操作,結(jié)合具體實(shí)例形式分析了Go語(yǔ)言map判斷與刪除相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • golang?字符串拼接方法對(duì)比分析

    golang?字符串拼接方法對(duì)比分析

    這篇文章主要為大家介紹了golang?字符串拼接方法對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式

    golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式

    這篇文章主要介紹了golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言建議多使用切片少使用數(shù)組原理探究

    Go語(yǔ)言建議多使用切片少使用數(shù)組原理探究

    這篇文章主要為大家介紹了Go語(yǔ)言建議多使用切片少使用數(shù)組原理探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

    Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

    負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時(shí)可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢(xún)負(fù)載均衡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • logrus日志自定義格式操作

    logrus日志自定義格式操作

    這篇文章主要介紹了logrus日志自定義格式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Go 互斥鎖和讀寫(xiě)互斥鎖的實(shí)現(xiàn)

    Go 互斥鎖和讀寫(xiě)互斥鎖的實(shí)現(xiàn)

    本文主要介紹了Go 互斥鎖和讀寫(xiě)互斥鎖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論