Go 之获取变量类型

Python 可以通过 type 快速获取变量类型。Ruby 也可以通过 class 方法快速获取变量类型。

lists = [1, 2, 3, 4, 5]
print(type(lists))  # <class 'list'>
lists = [1, 2, 3, 4, 5]
puts lists.class # Array

 那么 Go 有哪些获取变量类型的方法呢?

fmt.Printf("%T")

首先当然可以利用 fmt.Printf 中的格式化转义字符来输出相应变量的类型。

%T     相应值的类型的Go语法表示
package main

import "fmt"

func main() {
	a := []int{1, 2, 3}
	fmt.Printf("%T\n", a) // []int
	b := [3]int{1, 2, 3}
	fmt.Printf("%T\n", b) // [3]int
}

类型断言

Go 中提供了类型断言检测变量类型,是 Go 语言中提供的类型检查和转换的一种方式。

如果断言正确的话,布尔变量 ok 就为 true,同时会将变量值设为断言之前变量的值。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	s, ok := i.([]int)
	fmt.Println(ok) // true
	fmt.Println(s)  // [1 2 3]
}

如果断言错误的话,布尔变量 ok 就为 false,同时会将变量转换成所断言的类型的零值。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	s, ok := i.([5]int)
	fmt.Println(ok) // false
	fmt.Println(s)  // [0 0 0 0 0]
}

类型选择

类型选择与类型推断类似,也是 Go 语言中提供的类型检查和转换的一种方式。

只不过类型断言需要提前明确一种类型,然后断言是不是给定的类型;类型选择则是通过 .(type) 结合 switch 来判断具体是哪一种具体类型。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	switch v := i.(type) {
	case string:
		fmt.Printf("string type: %v\n", v)
	case int:
		fmt.Printf("int type: %v\n", v)
	case [3]int:
		fmt.Printf("[]int type: %v\n", v) // []int type: [1 2 3]
	default:
		fmt.Printf("Unknown type: %v\n", v)
	}
}

reflect.TypeOf

我们还可以通过 reflect.TypeOf 函数返回变量的类型对象 reflect.Type,它表示其参数的类型。

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var i interface{} = []int{1, 2, 3}
	t := reflect.TypeOf(i)
	fmt.Printf("%v\n", t) // []int
}

reflect.ValueOf

可以先通过 reflect.ValueOf() 获取值,再使用 .Type() 获取变量类型。

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var i interface{} = []int{1, 2, 3}
	v := reflect.ValueOf(i)
	fmt.Printf("%v\n", v.Type()) // []int
}

也可以用于获取结构体变量的字段类型。

package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string
	Age  int
}

func (s Person) String() string {
	return fmt.Sprintf("Name is %s, Age is %d", s.Name, s.Age)
}

func main() {
	person := Person{"Looking", 30}
	fmt.Println(person) // Name is Looking, Age is 30
	t := reflect.TypeOf(person)
	fmt.Println("Type of person:", t) // Type of person: main.Person

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		fmt.Printf("Field Name: '%s', Field Type: '%s'\n", field.Name, field.Type)
		// Field Name: 'Name', Field Type: 'string'
		// Field Name: 'Age', Field Type: 'int'
	}
}

相关推荐

  1. Go 获取变量类型

    2024-04-22 11:48:03       39 阅读
  2. go语言获取变量类型的4种方式

    2024-04-22 11:48:03       30 阅读
  3. golang获取变量动态类型

    2024-04-22 11:48:03       30 阅读
  4. go语言打印出变量类型

    2024-04-22 11:48:03       24 阅读
  5. GO基础变量与常量

    2024-04-22 11:48:03       52 阅读
  6. 2-go-变量定义、类型、常量、函数

    2024-04-22 11:48:03       56 阅读
  7. Go语言】常用变量类型的创建

    2024-04-22 11:48:03       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 11:48:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 11:48:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 11:48:03       87 阅读
  4. Python语言-面向对象

    2024-04-22 11:48:03       96 阅读

热门阅读

  1. 【QT教程】QT6图形渲染与OpenGL编程

    2024-04-22 11:48:03       31 阅读
  2. 探索 Git:开源项目管理的利器

    2024-04-22 11:48:03       42 阅读
  3. Go读取文件n行的思路之旅

    2024-04-22 11:48:03       40 阅读
  4. 聚合支付的代付业务详解

    2024-04-22 11:48:03       41 阅读
  5. 大模型prompt engineering api开发

    2024-04-22 11:48:03       130 阅读
  6. torch.where()中并行方式的实现

    2024-04-22 11:48:03       82 阅读
  7. http和https区别与上网过程

    2024-04-22 11:48:03       35 阅读
  8. SQLite去除.db-shm和.db-wal文件【已解决】

    2024-04-22 11:48:03       34 阅读
  9. Spring Boot 中整合 Redisson 实现分布式锁

    2024-04-22 11:48:03       39 阅读
  10. 三年经验!你还不知道KVM虚拟化技术???

    2024-04-22 11:48:03       42 阅读
  11. python内存泄漏解决

    2024-04-22 11:48:03       35 阅读
  12. 工程师每日刷题-7

    2024-04-22 11:48:03       40 阅读
  13. Vue模版语法(初学Vue之v-指令语法)

    2024-04-22 11:48:03       40 阅读