当前位置: 首页 > news >正文

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

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

相关文章:

  • 如何将想要执行的代码和Spring Boot 项目的启动类一起执行(ES为例)
  • 【高危】Apache Solr 环境变量信息泄漏漏洞
  • 37-WEB漏洞-反序列化之PHPJAVA全解(上)
  • 【刷题笔记4】
  • IOT pwn
  • Redis 笔记一
  • 数据分析实战:城市房价分析
  • 从浅入深讲解Java继承
  • ctfshow-反序列化(web267-web270)
  • 用的到的linux-Day1
  • 100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战
  • 如何发布自己的npm包
  • C语言算法赛——蓝桥杯(省赛试题)
  • 基于SpringBoot Vue高校失物招领系统
  • Docker consul
  • Flink(十四)【Flink SQL(中)查询】
  • How to disagree with ideas
  • 【Nginx】使用自生成证书配置nginx代理https
  • Nginx快速入门
  • mariadb数据库从入门到精通
  • “一码难求”的Manus开放注册但价格不菲,智能体距离“实用”还有多远
  • 在笔墨金石间,看胡问遂与梅舒适的艺术对话
  • 《淮水竹亭》:一手好牌,为何打成这样
  • 多元史料下的“西狩”叙事——《“庚子西狩”中外资料六种》解题
  • 陈宝良 高寿仙 彭勇︱明清社会的皇权、商帮与市井百态
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?