網站首頁 編程語言 正文
Go提供幾種方法檢查變量的類型,在字符串格式化標識%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind,另外還有使用類型斷言,switch case方式。下面通過實例分別介紹這四類方法。
%T 格式化標識
使用%T字符串格式化標識是最簡單的檢查類型方式。%T是fmt包,可以使用fmt.Printf顯示變量類型:
import ( "fmt" ) func main() { var count int = 42 var message string = "go find type" var isCheck bool = true var amount float32 = 10.2 fmt.Printf("variable count=%v is of type %T \n", count, count) fmt.Printf("variable message='%v' is of type %T \n", message, message) fmt.Printf("variable isCheck='%v' is of type %T \n", isCheck, isCheck) fmt.Printf("variable amount=%v is of type %T \n", amount, amount) } //OutPut variable count=42 is of type int variable message='go find type' is of type string variable isCheck='true' is of type bool variable amount=10.2 is of type float32
使用reflect包函數
如果上述方法沒有用,或希望獲得類型的更多信息,可以使用reflect包的TypeOf和ValueOf().Kind函數。
reflect.TypeOf()
如果給TypeOf方法傳入變量值,則會返回變量類型。當然也可以傳遞變量,但也支持直接傳遞變量值,而不是變量,代碼如下:
fmt.Printf("%v", reflect.TypeOf(10)) //int fmt.Printf("%v", reflect.TypeOf("Go Language")) //string
下面是不同的變量類型的完整示例:
package main import ( "fmt" "reflect" ) func main() { var days int = 42 var typemessage string = "go find type" var isFound bool = false var objectValue float32 = 10.2 fmt.Printf("variable days=%v is of type %v \n", days, reflect.TypeOf(days)) fmt.Printf("variable typemessage='%v' is of type %v \n", typemessage, reflect.TypeOf(typemessage)) fmt.Printf("variable isFound='%v' is of type %v \n", isFound, reflect.TypeOf(isFound)) fmt.Printf("variable objectValue=%v is of type %v \n", objectValue, reflect.TypeOf(objectValue)) } //OUTPUT variable days=42 is of type int variable typemessage='go find type' is of type string variable isCheck='false' is of type bool variable amount=10.2 is of type float32 variable acounts=Savings is of type string
reflect.ValueOf().Kind()
同樣使用ValueOf().Kind()也可以獲得變量的類型。 reflect.ValueOf()返回基于傳入的變量初始化新值,然后進一步通過Kind方法獲得變量類型:
package main import ( "fmt" "reflect" ) func main() { var days int = 42 var typemessage string = "go find type" var isFound bool = false var objectValue float32 = 10.2 fmt.Printf("variable days=%v is of type %v \n", days, reflect.ValueOf(days).Kind()) fmt.Printf("variable typemessage='%v' is of type %v \n", typemessage, reflect.ValueOf(typemessage).Kind()) fmt.Printf("variable isFound='%v' is of type %v \n", isFound, reflect.ValueOf(isFound).Kind()) fmt.Printf("variable objectValue=%v is of type %v \n", objectValue, reflect.ValueOf(objectValue).Kind()) } //OUTPUT variable days=42 is of type int variable typemessage='go find type' is of type string variable isCheck='false' is of type bool variable objectValue=10.2 is of type float32
這種方法的缺點是需要生成新的變量,這可能會增加內存占用。
使用類型斷言
本節介紹另一種方法是類型斷言。下面寫一個方法typeofObject進行類型判斷:
func typeofObject(variable interface{}) string { switch variable.(type) { case int: return "int" case float32: return "float32" case bool: return "boolean" case string: return "string" default: return "unknown" } } fmt.Println("Using type assertions") fmt.Println(typeofObject(count)) fmt.Println(typeofObject(message)) fmt.Println(typeofObject(isCheck)) fmt.Println(typeofObject(amount)) //OUTPUT Using type assertions int string boolean float64
這種方法的優點是可以對類型進行分組,例如,我們可以將所有int32、int64、uint32、uint64類型標識為“int”。
自定義方法檢查類型
通過上面的方法,我們可以編寫自己的方法,實現代碼重用:
// Using %T func typeofObject(variable interface{}) string { return fmt.Sprintf("%T", variable) } // Using reflect.TypeOf() func typeofObject(variable interface{}) string { return reflect.TypeOf(variable).String() } // Using reflect.ValueOf().Kind() func typeofObject(variable interface{}) string { return reflect.ValueOf(variable).Kind().String() }
下面調用上面方法進行測試:
fmt.Println(typeofObject(count)) fmt.Println(typeofObject(message)) fmt.Println(typeofObject(isCheck)) fmt.Println(typeofObject(amount)) //OUTPUT Using type assertions int string boolean float64
原文鏈接:https://blog.csdn.net/neweastsun/article/details/127489907
相關推薦
- 2023-06-17 C#?輸出參數out問題_C#教程
- 2022-05-23 C語言也有封裝,繼承和多態你知道嗎_C 語言
- 2022-01-07 vite + element項目按需引入后將語言設置為中文
- 2022-10-06 Redis中鍵和數據庫通用指令詳解_Redis
- 2022-07-21 React生命周期
- 2022-11-24 使用sqlserver官方驅動包調用存儲過程遇到的坑及解決方法_MsSql
- 2022-01-30 VSCode標簽內的代碼塊無法折疊問題解決
- 2022-12-15 Python爬蟲庫urllib的使用教程詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支