Go 之获取变量类型

发布于:2024-04-19 ⋅ 阅读:(154) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到