golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)
fmt.Printf("%T")方式
示例:
var1 := "hello world" fmt.Printf("var1 = %T\n", var1)
這個(gè)是最簡單,也是最推薦的在at rumtime時(shí)獲取變量類型的方式,
用fmt.Printf("%T")實(shí)現(xiàn)返回變量類型的函數(shù)
由此衍生出可復(fù)用獲取變量或者對象type的函數(shù),如下面函數(shù),直接返回變量類型
func typeofVariable(variable interface{}) string { return fmt.Sprintf("%T", variable) }
reflect.TypeOf方式
示例:
var1 := "hello world" fmt.Printf("var1: %s\n", reflect.TypeOf(var1))
用 reflect包里的函數(shù) TypeOf()來實(shí)現(xiàn),用起來相對來說復(fù)雜些,如果只是單純地想在runtime時(shí)獲取一下變量類型,還是推薦第一種方式
用reflect.TypeOf實(shí)現(xiàn)返回變量類型的函數(shù)
由此衍生出可復(fù)用獲取變量或?qū)ο髏ype的函數(shù),如下面函數(shù),直接返回變量類型
func typeofVariable(variable interface{}) string { return reflect.TypeOf(variable).String() }
reflect.ValueOf.Kind()方式
示例:
var1 := "hello world" fmt.Println(reflect.ValueOf(var1).Kind())
用 reflect.ValueOf.Kind()實(shí)現(xiàn)返回變量類型的函數(shù)
func typeofVariable(variable interface{}) string { return reflect.ValueOf(variable).Kind().String() }
斷言方式
func typeofObject(variable interface{}) string { switch variable.(type) { case string: return "string" case int: return "int" case float32: return "float32" case float64: return "float64" case bool: return "boolean" case []string: return "[]string" case complex128: return "complex128" case complex64: return "complex64" case map[string]float64: return "map" case Employee: return "Employee" default: return "unknown" } }
代碼示例:
package main import ( "fmt" "reflect" ) type Employee struct { name string age int salary float64 } // 4 ways to return a variable's type at runtime func typeofObject(variable interface{}) string { switch variable.(type) { case string: return "string" case int: return "int" case float32: return "float32" case float64: return "float64" case bool: return "boolean" case []string: return "[]string" case complex128: return "complex128" case complex64: return "complex64" case map[string]float64: return "map" case Employee: return "Employee" default: return "unknown" } } func main() { var1 := "hello world" var2 := 10 var3 := 2.55 var4 := []string{"BeiJing", "ShangHai", "ShenZhen"} var5 := map[string]float64{"BeiJing": 3.2, "ShaiHai": 1.2} var6 := complex(3,4) var7 := true var8 := Employee{"Sam",30,15000.5} fmt.Println("############### Using %T with Printf ########################") fmt.Printf("var1 = %T\n", var1) fmt.Printf("var2 = %T\n", var2) fmt.Printf("var3 = %T\n", var3) fmt.Printf("var4 = %T\n", var4) fmt.Printf("var5 = %T\n", var5) fmt.Printf("var6 = %T\n", var6) fmt.Printf("var7 = %T\n", var7) fmt.Printf("var8 = %T\n", var8) fmt.Println("###############Using reflect.TypeOf Function #######################") fmt.Printf("var1: %s\n", reflect.TypeOf(var1)) fmt.Printf("var2: %s\n", reflect.TypeOf(var2)) fmt.Printf("var3: %s\n", reflect.TypeOf(var3)) fmt.Printf("var4: %s\n", reflect.TypeOf(var4)) fmt.Printf("var5: %s\n", reflect.TypeOf(var5)) fmt.Printf("var6: %s\n", reflect.TypeOf(var6)) fmt.Printf("var7: %s\n", reflect.TypeOf(var7)) fmt.Printf("var8: %s\n", reflect.TypeOf(var8)) fmt.Println("###############Using reflect.ValueOf.Kind() ########################") fmt.Println(reflect.ValueOf(var1).Kind()) fmt.Println(reflect.ValueOf(var2).Kind()) fmt.Println(reflect.ValueOf(var3).Kind()) fmt.Println(reflect.ValueOf(var4).Kind()) fmt.Println(reflect.ValueOf(var5).Kind()) fmt.Println(reflect.ValueOf(var6).Kind()) fmt.Println(reflect.ValueOf(var7).Kind()) fmt.Println(reflect.ValueOf(var8).Kind()) fmt.Println("################## Using Type assertions ###########################") fmt.Println(typeofObject(var1)) fmt.Println(typeofObject(var2)) fmt.Println(typeofObject(var3)) fmt.Println(typeofObject(var4)) fmt.Println(typeofObject(var5)) fmt.Println(typeofObject(var6)) fmt.Println(typeofObject(var7)) fmt.Println(typeofObject(var8)) } /* 幾個(gè)復(fù)用的函數(shù)來判斷變量的類型at runtime // Using %T func typeofVariable(variable interface{}) string { return fmt.Sprintf("%T", variable) } // Using reflect.TypeOf() func typeofVariable(variable interface{}) string { return reflect.TypeOf(variable).String() } // Using reflect.ValueOf().Kind() func typeofVariable(variable interface{}) string { return reflect.ValueOf(variable).Kind().String() } */
結(jié)果演示:
總結(jié)
到此這篇關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)的文章就介紹到這了,更多相關(guān)golang獲取變量或?qū)ο箢愋蛢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析
這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例
本篇文章主要介紹了Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Golang實(shí)現(xiàn)自己的Redis(pipeline客戶端)實(shí)例探索
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis(pipeline客戶端)實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01golang gc的內(nèi)部優(yōu)化詳細(xì)介紹
Go編譯器在垃圾回收(GC)的掃描標(biāo)記階段,對存儲無指針鍵值對的map進(jìn)行了優(yōu)化,即在GC掃描時(shí)不深入掃描map內(nèi)部數(shù)據(jù),只檢查map本身是否需要回收,這一優(yōu)化顯著提升了GC掃描的速度,從而減少了GC對程序性能的影響2024-10-10解決GO編譯時(shí)避免引入外部動(dòng)態(tài)庫的問題
最近碰到一個(gè)問題,有一個(gè)流量采集的組件中使用到了github.com/google/gopacket 這個(gè)庫,這個(gè)庫使用一切正常,但是唯獨(dú)有一個(gè)缺點(diǎn),編譯后的二進(jìn)制文件依賴于libpcap.so的動(dòng)態(tài)庫,這篇文章主要介紹了GO編譯時(shí)避免引入外部動(dòng)態(tài)庫的解決方法,需要的朋友可以參考下2022-10-10使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟
Go語言是采用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發(fā),大家可以根據(jù)自己的喜好自行選擇,下面這篇文章主要給大家介紹了關(guān)于使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟,需要的朋友可以參考下2022-11-11golang?中?channel?的詳細(xì)使用、使用注意事項(xiàng)及死鎖問題解析
這篇文章主要介紹了golang?中?channel?的詳細(xì)使用、使用注意事項(xiàng)及死鎖分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03