日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang——Tag、自定义类型、未命名类型

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang——Tag、自定义类型、未命名类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tag:

  • tag并不是注釋,而是用來對字段進行描述的元數據。盡管它不屬于數據成員, 但卻是類型的組成部分。
  • 在運行期,可用反射獲取標簽信息。常被用作格式校驗,數據庫關系映射等
    Tag是一個字符串,以key、value形式存在,用于標記字段說明,可以配合反射使用,以及Json解析
  • key:不能為空,不能包含、空格、引號、冒號
  • value:使用雙引號
type User struct {name string `name:"userName"`age int `age:"userAge"` }

獲取結構體Tag內容:

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是類型的組成部分,并非數據注釋那么簡單

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 }

自定義類型:

使用關鍵字type定義用戶自定義類型,包括基于現有類型創建,或結構體、有數類型等

func main() {fmt.Println(read, exit) }type myByte byte // 從書上看到有這個操作,但是不太理解存在的意義,其實myByte最終指向的還是byte,何必多此一舉const (read myByte = iotaexit )

多個type定義可合并成組,可在函數或代碼塊內定義局部類型

func main() {type (user struct { // 結構體name stringage uint}event func(string) // 函數類型)u := user{"itzhuzhu", 24}fmt.Println(u)var f event = func(s string) {fmt.Println(s)}f("haha") }

但須注意,即便指定了基礎類型,也只是表明它們擁有相同的數據結構,兩者間不存在任何關系,屬完全不同的兩種類型。除操作符外,自定義類型不會繼承基礎類型的任何信息 (包括方法),不能視作別名,不能隱式轉換或直接用于比較表達式。

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) }

未命名類型:

與有明確標識符的bool、int、string等類型相比array、slice、map、channel等類型與具體的元素類型或長度等屬性有關,故稱作未命名類型(unnamedtype)。當然,可用type為其提供具體名稱以變為命名類型(namedtype)。

具有相同聲明的未命名類型被視作同一類型

  • 具有相同基類型的指針
  • 具有相同元素類型和長度的array
  • 具有相同元素類型的slice
  • 具有相同鍵值類型的map
  • 具有相同數據類型及操作方向的channel
  • 具有相同字段序列(字段名、字段類型、標簽以及字段順序)的struct
  • 具有相同簽名(參數和返回值列表,不包括參數名)的function
  • 具有相同方法集(方法名、方法簽名,不包括順序)的interface

函數的參數順序也屬于簽名組成部分

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) }

未命名類型轉換規則:

  • 類型相同
  • 基礎類型相同,且其中一個是未命名類型
  • 數據類型相同,將雙向channe 1賦值給單向類型,且其中一個為未命名類型
  • 將 nil 賦值給 s1ice、map、channel、pointer、function 以及 interface
  • 實現了目標interface
func main() {type data [2]intvar d data = [2]int{1, 2} //基礎類型相同,右值為未命名類型。fmt.Println(d)a := make(chan int, 2)var b chan<- int = a // chan轉換為chan<-,其中b為未命名類型。b <- 2 }

總結

以上是生活随笔為你收集整理的Golang——Tag、自定义类型、未命名类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。