NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • Java视角看Go

    • 前言
    • 环境安装
    • 介绍
    • 基本语法
    • 集合
    • 面向对象
    • 反射
      • pair
      • reflect包
      • 结构体标签(类似注解)
    • 协程
    • 常见库
  • other

  • 笔记

  • 代码片段

  • Golang
  • Java视角看Go
NipGeihou
2022-12-31
目录

反射

# pair

image-20221231011714566

# reflect 包

func main() {
	var a interface{}
	a = 10
	fmt.Println(a)

	// 类型断言
	value, ok := a.(int)
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("类型断言失败")
	}

	// 反射
	// 获取变量的类型
	fmt.Println(reflect.TypeOf(a)) // int
	// 获取变量的值
	fmt.Println(reflect.ValueOf(a)) // 10

	// 获取变量的类型
	typeOfA := reflect.TypeOf(a)
	fmt.Println(typeOfA.Name(), typeOfA.Kind()) // int int

	// 获取变量的值
	valueOfA := reflect.ValueOf(a)
	fmt.Println(valueOfA.Int()) // 10
}
  • reflect.TypeOf() :获取变量的类型
  • reflect.TypeOf().Name() :获取变量的类型,转换为 string 类型
  • reflect.TypeOf().Kind() :获取变量的类型,转换为枚举类型
  • reflect.ValueOf() :获取变量的值
  • reflect.ValueOf().Int() :获取变量的值,转换为 int 类型

更多反射的使用方法,参考 Go 语言反射 (opens new window)

# 结构体标签(类似注解)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
  • 结构体标签的本质是一个字符串
  • 结构体标签的格式: key:"value"
  • 结构体标签的使用: reflect.TypeOf().Field().Tag.Get("key")
func main() {
	var a interface{}
	a = Person{"张三", 18}
	fmt.Println(a)

	// 反射
	// 获取变量的类型
	typeOfA := reflect.TypeOf(a)
	fmt.Println(typeOfA.Name(), typeOfA.Kind()) // Person struct

	// 获取变量的值
	valueOfA := reflect.ValueOf(a)
	fmt.Println(valueOfA.Field(0).String()) // 张三
	fmt.Println(valueOfA.Field(1).Int()) // 18

	// 获取结构体标签
	fmt.Println(typeOfA.Field(0).Tag.Get("json")) // name
	fmt.Println(typeOfA.Field(1).Tag.Get("json")) // age
}

应用场景:JSON 序列化

type Movie struct {
	Title  string `json:"title"`
	Year   int    `json:"year"`
	Price  int    `json:"rmb"`
	Actors []string `json:"actors"`
}

func main() {
	movie := Movie{
		Title:  "肖申克的救赎",
		Year:   1994,
		Price:  100,
		Actors: []string{"蒂姆·罗宾斯", "摩根·弗里曼", "鲍勃·冈顿"},
	}

	// 序列化 JSON字符串
	data, err := json.Marshal(movie)
	if err != nil {
		fmt.Println("序列化失败")
		return
	}
	fmt.Printf("%s\n", data)

	// 反序列化
	var movie2 Movie
	err = json.Unmarshal(data, &movie2)
	if err != nil {
		fmt.Println("反序列化失败")
		return
	}
	fmt.Println(movie2)
}

控制台输出:

{"title":"肖申克的救赎","year":1994,"rmb":100,"actors":["蒂姆·罗宾斯","摩根·弗里曼","鲍勃·冈顿"]}
{肖申克的救赎 1994 100 [蒂姆·罗宾斯 摩根·弗里曼 鲍勃·冈顿]}

应用场景:ORM

略

上次更新: 2024/03/11, 22:37:05
面向对象
协程

← 面向对象 协程→

最近更新
01
iSCSI服务搭建
05-10
02
磁盘管理与文件系统
05-02
03
网络测试 - iperf3
05-02
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式