NipGeihou's blog NipGeihou's blog
  • 开发规范
  • 进阶笔记
  • 微服务
  • 快速开始
  • 设计模式
  • NoSQL 数据库

    • Redis
  • 数据结构与算法
  • 计算机网络
烹饪
关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • 开发规范
  • 进阶笔记
  • 微服务
  • 快速开始
  • 设计模式
  • NoSQL 数据库

    • Redis
  • 数据结构与算法
  • 计算机网络
烹饪
关于
  • 分类
  • 标签
  • 归档
  • 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

略

上次更新: 2023/06/09, 15:18:42
面向对象
协程

← 面向对象 协程→

最近更新
01
防火墙 - iptables
06-08
02
网络配置 - ip
06-07
03
第三方登录 - Google
06-07
更多文章>
Theme by Vdoing | Copyright © 2018-2023 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式