成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go中你用對枚舉了么?

開發 后端
枚舉是強類型編程語言中的一種類型,由一組名稱和值組成。通常用來在編程語言中充當常量的標識符。

[[377256]]

枚舉的本質是什么,我們天天寫代碼用枚舉,那啥是枚舉啊。wiki上是這么說的

  • In computer programming, an enumerated type (also called enumeration, enum, or factor in the R programming language, and a categorical variable in statistics) is a data type consisting of a set of named values called elements, members, enumeral, or enumerators of the type. The enumerator names are usually identifiers that behave as constants in the language. An enumerated type can be seen as a degenerate tagged union of unit type. A variable that has been declared as having an enumerated type can be assigned any of the enumerators as a value. In other words, an enumerated type has values that are different from each other, and that can be compared and assigned, but are not specified by the programmer as having any particular concrete representation in the computer’s memory; compilers and interpreters can represent them arbitrarily.

用人話說就是

枚舉是強類型編程語言中的一種類型,由一組名稱和值組成。通常用來在編程語言中充當常量的標識符。

沒毛病,我們也確實是這樣使用的。比如上學的時候,經常寫c的小玩具代碼,c標準里面提供了enum關鍵字,寫起來比較直白,使用的時候和struct類似,需要enum week這樣寫,c里面默認枚舉值是從0開始,int類型,其實c里面就是把枚舉當做int類型來用的。

  1. #include<stdio.h>  
  2.    
  3. enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};  
  4.    
  5. int main()  
  6. {  
  7.     enum week day;             // 需要加 enum 關鍵字 
  8.     day = Wed;  
  9.     printf("%d",day);          // 輸出 2 
  10.     int i;  
  11.     for (i=Mon; i<=Sun; i++){  // 可以直接把枚舉類型賦值給int類型 
  12.       printf("%d ", i);        // 輸出 0,1,2,3,4,5,6 
  13.     } 
  14.     return 0;  
  15. }   

上面的例子沒問題,在初始化的時候,枚舉值默認情況下,編譯器會從分配0開始的值,例如上面的Mon=0,Tue=1…,但是也會想不按照編譯器的默認分配方式,由我自己分配,那怎么寫呢,看下面的例子:

  1. #include <stdio.h>  
  2. enum day {sunday = 1, monday, tuesday = 5,  
  3.           wednesday, thursday = 10, friday, saturday};  
  4.    
  5. int main()  
  6. {  
  7.     printf("%d %d %d %d %d %d %d", sunday, monday, tuesday,  
  8.             wednesday, thursday, friday, saturday); // 輸出1 2 5 6 10 11 12 
  9.     return 0;  
  10. }  

也就是說,枚舉里面可以按任何順序將值分配給某個名稱。所有未分配的名稱都會把值作為前一個名稱的值加一。

其實,定義幾個常量的事,是不是用宏這個東西更好呢,比如這么寫

  1. #define sunday  0  
  2. #define monday  1  
  3. #define tuesday 2 

但是老師說了,盡量別用宏,不是說宏不好,宏也好,編譯器替換,沒有運行期啥事,多快啊,但是有幾個問題:

1)宏沒有作用域一說 2)枚舉是類型安全的

扯的有點遠了,現在回來看看Go里面的枚舉怎么寫。當然也很簡單了,官方教導我們這么寫:

  1. type ByteSize float64 
  2.  
  3. const ( 
  4.     _           = iota 
  5.     KB ByteSize = 1 << (10 * iota) 
  6.     MB 
  7.     GB 

Go里面更簡潔了,直接把enum關鍵字去掉了,其實從Go的角度看,枚舉不就是常量么,搞這么多語法糖干嘛,Go里面提供了一個關鍵字iota可以實現常量的遞增,同時也支持手動賦值,iota和手動賦值結合起來,就可以實現類似c里面的效果

  1. const ( 
  2.     A0 = iota 
  3.     A1 = iota 
  4.     A2 = iota 
  5. fmt.Println(A0, A1, A2) // "0 1 2" 

可以 簡寫成這樣

  1. const ( 
  2.     A0 = iota 
  3.     A1 
  4.     A2 

也可以從1開始

  1. const ( 
  2.     A1 = iota + 1 
  3.     A2 
  4.     A3 
  5. fmt.Println(A1, A2, A3) // "1 2 3" 

或者跳過某個值

  1. const ( 
  2.     C1 = iota + 1 
  3.     _ 
  4.     C3 
  5.     C4 
  6. fmt.Println(C1, C3, C4) // "1 3 4" 

看到這里你或許有個疑問,這里的枚舉其實就是常量么,那怎么寫是字符串類型的枚舉呢,你可能會說,當然是用字符串常量了。但是那只是字符串常量了,沒有枚舉的性質。我可能想要的是一種字符串到值的枚舉類型。思考再三,看我這種寫法是否可以:

  • 步驟一:創建一個新的int類型
  • 步驟二:使用iota表示值
  • 步驟三:給這個新的類型一個String的方法
  1. type Direction int 
  2.  
  3. const ( 
  4.     North Direction = iota 
  5.     East 
  6.     South 
  7.     West 
  8.  
  9. func (d Direction) String() string { 
  10.     return [...]string{"North""East""South""West"}[d] 

使用的時候

  1. var d Direction = North 
  2. fmt.Print(d) 
  3. switch d { 
  4. case North: 
  5.     fmt.Println(" goes up."
  6. case South: 
  7.     fmt.Println(" goes down."
  8. default
  9.     fmt.Println(" stays put."

當然還有一種方法,比較stupid

  1. type weekday string 
  2.  
  3. func (w weekday) isWeekday() weekday { 
  4.     return w 
  5.  
  6. type Weekday interface { 
  7.     isWeekday() weekday 
  8.  
  9. const ( 
  10.     Monday   = weekday("Monday"
  11.     Tuesday  = weekday("Tuesday"
  12.     Wendsday = weekday("Wendsday"
  13.     Thursday = weekday("Thursday"
  14.     Friday   = weekday("Friday"
  15.     Saturday = weekday("Saturday"
  16.     Sunday   = weekday("Sunday"
  17. // 使用 
  18. func main() { 
  19.     var d1 = weekday.Monday 
  20.     var d2 = weekday.Tuesday 
  21.  
  22.     fmt.Println(d1, d2, d1 == d2, d1 == weekday.Monday) 

如果使用struct表示枚舉,那其實還可以使用反射的方式,比如下面這樣寫:

  1. import ( 
  2.    "reflect" 
  3.  
  4. type weekday struct { 
  5.    Monday, Tuesday, Wendsday, Thursday, Friday, Saturday, Sunday int 
  6.  
  7. func (c weekday) Get(id string) int { 
  8.    vo := reflect.ValueOf(c) 
  9.    typeVo := vo.Type() 
  10.  
  11.    for i := 0; i < vo.NumField(); i++ { 
  12.       if typeVo.Field(i).Name == id { 
  13.          return vo.Field(i).Interface().(int
  14.       } 
  15.    } 
  16.    return 0 
  17.  
  18. var weekdayEnum = weekday { 
  19.    Monday:   1, 
  20.    Tuesday:  2, 
  21.    Wendsday: 3, 
  22.    Thursday: 4, 
  23.    Friday:   5, 
  24.    Saturday: 6, 
  25.    Sunday:   7 

本文轉載自微信公眾號「碼小菜」,可以通過以下二維碼關注。轉載本文請聯系碼小菜公眾號。

 

責任編輯:武曉燕 來源: 碼小菜
相關推薦

2018-07-01 08:34:09

緩存數據服務

2019-12-10 10:13:58

HTTPNginxRedirect

2021-03-16 22:44:18

Go語言開發

2022-07-25 14:54:32

前端

2022-06-09 10:42:47

GoJSON

2021-11-29 09:45:57

枚舉Go代碼

2021-09-13 07:53:31

Go錯誤處理

2021-09-02 12:10:52

Go語言枚舉類型

2020-05-06 20:40:03

Go編程語言

2022-08-15 08:06:49

Go語言類型

2022-02-21 18:16:38

Go語言枚舉

2022-05-18 08:00:26

函數劫持JavaScript鉤子函數

2019-08-27 08:24:17

簡歷技能工作

2009-07-20 10:18:49

PHP 5.3命名空間

2024-01-18 00:16:07

2020-06-23 14:09:49

枚舉JDK場景

2021-09-13 07:23:52

Go Set 設計

2021-11-08 10:58:08

變量依賴圖排序

2013-06-09 10:37:14

架構框架

2022-08-23 08:53:31

Go項目語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕99 | 日本中文字幕在线观看 | 欧美精品一区免费 | 操一草 | 亚洲一区二区三区在线 | 福利视频网站 | 久久国产精品视频免费看 | 国产欧美日韩久久久 | 日本一道本视频 | 国产日韩欧美一区 | 欧美午夜精品 | 国产精品久久久久久久三级 | 粉嫩高清一区二区三区 | 午夜影视免费片在线观看 | 免费av观看| 一区二区三区国产 | 日韩精品视频在线免费观看 | 精一区二区 | 欧美日一区二区 | 亚洲精品电影网在线观看 | 青青草视频网 | 中文在线а√在线8 | 国产精品视频一区二区三 | 精品久久电影 | 久久国产精品精品国产色婷婷 | 天天射色综合 | 亚洲情综合五月天 | 成人黄色在线 | 成人在线视频一区 | 欧美日韩亚洲视频 | 免费视频99 | 国产91中文 | 久久亚洲一区二区三区四区 | 91av视频在线观看 | 欧美a在线 | 久国产 | 99在线精品视频 | 成人黄色在线 | 99久久精品免费看国产免费软件 | 九九久久国产 | 成人在线不卡 |