Go語言提供了一種機制在運行中獲取某個變量的類型,獲取或修改變量的值,調用變量的方法。
示例代碼如下
1. 使用 x.(type)獲取變量類型
package main
import "strconv"
//StrPrint 將幾種已知數(shù)據(jù)類型轉化為 string
func StrPrint(x interface{}) string {
// 表示具有string方法的接口
type stringer interface {
String() string
}
switch x := x.(type) {
case stringer:
return x.String()
case string:
return x
case int:
return strconv.Itoa(x)
case bool:
if x {
return "true"
}
return "false"
default:
return "???"
}
}
func main() {
StrPrint(2333)
}
2. 通過 reflect.Value 獲取變量類型
通過 reflect.Value
判斷變量類型,并轉換成 string
。
package format
import (
"reflect"
"strconv"
)
func Any(value interface{}) string {
return formatAtom(reflect.ValueOf(value))
}
// formatAtom 將變量轉為string
func formatAtom(v reflect.Value) string {
switch v.Kind() {
case reflect.Invalid:
return "invalid"
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return strconv.FormatInt(v.Int(), 10)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return strconv.FormatUint(v.Uint(), 10)
case reflect.Float32, reflect.Float64:
return strconv.FormatFloat(v.Float(), 'f', -1, 64)
case reflect.Complex64, reflect.Complex128:
return strconv.FormatComplex(v.Complex(), 'f', -1, 128)
case reflect.Bool:
return strconv.FormatBool(v.Bool())
case reflect.String:
return strconv.Quote(v.String())
case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map:
return v.Type().String() + " 0x" + strconv.FormatUint(uint64(v.Pointer()), 16)
default:
return v.Type().String() + " value"
}
}
3.使用類型斷言將變量轉換為特定類型
value, ok := x.(T)
package main
import (
"fmt"
)
func main() {
var x interface{}
x = 2333
value, ok := x.(int)
fmt.Print(value, ",", ok)
}
輸出結果:文章來源:http://www.zghlxwxcb.cn/news/detail-813983.html
2333,true
4. 使用反射獲取一個結構體的字段信息
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{"Alice", 25}
// 獲取類型信息
t := reflect.TypeOf(p)
fmt.Println("Type:", t)
// 獲取字段信息
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Println("Field:", field.Name, field.Type)
}
}
輸出結果:文章來源地址http://www.zghlxwxcb.cn/news/detail-813983.html
Type: main.Person
Field: Name string
Field: Age int
到了這里,關于Golang 中的反射,并用來獲取數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!