在Go語(yǔ)言中結(jié)構(gòu)體原生語(yǔ)法是不支持設(shè)置默認(rèn)值的,這就在很多場(chǎng)景中需要增加額外的步驟,去設(shè)置一些默認(rèn)值。
自從 Go 1.18支持泛型后,再通過(guò)反射功能即可實(shí)現(xiàn)為結(jié)構(gòu)體設(shè)置默認(rèn)值。
原理也非常簡(jiǎn)單,只要將結(jié)構(gòu)體的標(biāo)簽中設(shè)置一個(gè)Key,即可通過(guò)Key的值賦予對(duì)象的指定字段。
package main import ( "fmt" "reflect" "strconv" ) type Person struct { Name string `df:"無(wú)名氏"` Age int `df:"18"` } func main() { // 實(shí)例化類并指定標(biāo)簽 p := NewClass(Person{}, "df") // 結(jié)果:{無(wú)名氏 18} fmt.Println(p) } // 實(shí)例化結(jié)構(gòu)體 // 目前只能實(shí)現(xiàn)基本數(shù)據(jù)類型 func NewClass[T any](cls T, dfKey string) T { rt := reflect.ValueOf(&cls).Elem() vt := rt.Type() for i := 0; i < rt.NumField(); i++ { f := rt.Field(i) tag, ok := vt.Field(i).Tag.Lookup(dfKey) if ok { switch f.Kind() { case reflect.Bool: i, _ := strconv.ParseBool(tag) f.SetBool(i) case reflect.String: f.SetString(tag) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: i, _ := strconv.ParseInt(tag, 10, 64) f.SetInt(i) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: i, _ := strconv.ParseUint(tag, 10, 64) f.SetUint(i) case reflect.Float32, reflect.Float64: i, _ := strconv.ParseFloat(tag, 64) f.SetFloat(i) // 更多數(shù)據(jù)類型支持需要自己定義規(guī)則 } } } return cls }
文章來(lái)源地址http://www.zghlxwxcb.cn/article/269.html文章來(lái)源:http://www.zghlxwxcb.cn/article/269.html
到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)結(jié)構(gòu)體初始化設(shè)置默認(rèn)值的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!