Golang 中的反射,并用来获取数据类型

发布时间:2024年01月20日

Go语言提供了一种机制在运行中获取某个变量的类型,获取或修改变量的值,调用变量的方法。

示例代码如下

1. 使用 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)
}

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)
}

输出结果:

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)
	}
}

输出结果:

Type: main.Person
Field: Name string
Field: Age int
文章来源:https://blog.csdn.net/qq_19661477/article/details/135660786
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。