Go语言提供了一种机制在运行中获取某个变量的类型,获取或修改变量的值,调用变量的方法。
示例代码如下
x.(type)
获取变量类型package main
import "strconv"
//StrPrint 将几种已知数据类型转化为 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)
}
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"
}
}
value, ok := x.(T)
package main
import (
"fmt"
)
func main() {
var x interface{}
x = 2333
value, ok := x.(int)
fmt.Print(value, ",", ok)
}
输出结果:
2333,true
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)
}
}
输出结果:
Type: main.Person
Field: Name string
Field: Age int