Golang——Tag、自定义类型、未命名类型
生活随笔
收集整理的這篇文章主要介紹了
Golang——Tag、自定义类型、未命名类型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Tag:
- tag并不是注釋,而是用來對字段進(jìn)行描述的元數(shù)據(jù)。盡管它不屬于數(shù)據(jù)成員, 但卻是類型的組成部分。
- 在運(yùn)行期,可用反射獲取標(biāo)簽信息。常被用作格式校驗(yàn),數(shù)據(jù)庫關(guān)系映射等
Tag是一個字符串,以key、value形式存在,用于標(biāo)記字段說明,可以配合反射使用,以及Json解析
- key:不能為空,不能包含、空格、引號、冒號
- value:使用雙引號
獲取結(jié)構(gòu)體Tag內(nèi)容:
type User struct {name string `name:"userName"`age int `age:"userAge"` }func main() {u := User{}user := reflect.TypeOf(u)field := user.Field(0)fmt.Println(field.Tag.Get("name"))field2 := user.Field(1)fmt.Println(field2.Tag.Get("age")) }容易忽視的就是struct tag是類型的組成部分,并非數(shù)據(jù)注釋那么簡單
func main() {var a struct { x int `x`s string `s`}var b struct {x ints string}b = a // err:cannot use a type// struct { x int "x"; s string "s" } as type// struct { x int; s string } in assignment }自定義類型:
使用關(guān)鍵字type定義用戶自定義類型,包括基于現(xiàn)有類型創(chuàng)建,或結(jié)構(gòu)體、有數(shù)類型等
func main() {fmt.Println(read, exit) }type myByte byte // 從書上看到有這個操作,但是不太理解存在的意義,其實(shí)myByte最終指向的還是byte,何必多此一舉const (read myByte = iotaexit )多個type定義可合并成組,可在函數(shù)或代碼塊內(nèi)定義局部類型
func main() {type (user struct { // 結(jié)構(gòu)體name stringage uint}event func(string) // 函數(shù)類型)u := user{"itzhuzhu", 24}fmt.Println(u)var f event = func(s string) {fmt.Println(s)}f("haha") }但須注意,即便指定了基礎(chǔ)類型,也只是表明它們擁有相同的數(shù)據(jù)結(jié)構(gòu),兩者間不存在任何關(guān)系,屬完全不同的兩種類型。除操作符外,自定義類型不會繼承基礎(chǔ)類型的任何信息 (包括方法),不能視作別名,不能隱式轉(zhuǎn)換或直接用于比較表達(dá)式。
func main() {type data intvar d data = 10var x int = d // err: cannot use d (type data) as type int in assignmentprintln(x)println(d == x) // err: invalid operation: d == x (mismatched types data and int) }未命名類型:
與有明確標(biāo)識符的bool、int、string等類型相比array、slice、map、channel等類型與具體的元素類型或長度等屬性有關(guān),故稱作未命名類型(unnamedtype)。當(dāng)然,可用type為其提供具體名稱以變?yōu)槊愋?#xff08;namedtype)。
具有相同聲明的未命名類型被視作同一類型
- 具有相同基類型的指針
- 具有相同元素類型和長度的array
- 具有相同元素類型的slice
- 具有相同鍵值類型的map
- 具有相同數(shù)據(jù)類型及操作方向的channel
- 具有相同字段序列(字段名、字段類型、標(biāo)簽以及字段順序)的struct
- 具有相同簽名(參數(shù)和返回值列表,不包括參數(shù)名)的function
- 具有相同方法集(方法名、方法簽名,不包括順序)的interface
函數(shù)的參數(shù)順序也屬于簽名組成部分
func main() {var a func(int, string)var b func(string, int)b = a // err: cannot use a (type func(int, string)) as type// func(string, int) in assignmentb("s", 1) }未命名類型轉(zhuǎn)換規(guī)則:
- 類型相同
- 基礎(chǔ)類型相同,且其中一個是未命名類型
- 數(shù)據(jù)類型相同,將雙向channe 1賦值給單向類型,且其中一個為未命名類型
- 將 nil 賦值給 s1ice、map、channel、pointer、function 以及 interface
- 實(shí)現(xiàn)了目標(biāo)interface
總結(jié)
以上是生活随笔為你收集整理的Golang——Tag、自定义类型、未命名类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复地邮箱服务器地址,打印服务器设置方法
- 下一篇: vscode怎样导入数据_【Python