golang判断变量的类型

package main

import (
	"fmt"
	"reflect"
)

type T interface {}
type X string
type Y = string
func main() {
	var t T = "abc"
	var x X = "abc"
	var y Y ="abc"
	fmt.Println(t==x)
	fmt.Println(t == string(x))

	fmt.Println(t == y)
	fmt.Println(t == string(y))
    
    
	fmt.Println(reflect.TypeOf(t)) 
    //格式化输出变量类型
	fmt.Printf("%T\n", t)
	fmt.Println(reflect.TypeOf(x))
    //反射打印变量类型
	fmt.Println(reflect.TypeOf(y))
    //反射打印变量值
	fmt.Println(reflect.ValueOf(y))
}

/*
false
true
true
true
string
string
main.X
string
abc
*/
/*
当非接口类型 X 的值是可比较的且 X 实现了接口类型 T ,那么 X 的值 x 和 T 的值 t 是可比较的。如果 t 的动态类型和 X 一致并且 t 的动态值等于 x 的话,那么它们相等。
*/

详细解释
第1行, 使用package定义包名
第3,4,5行, 使用import导入其他包, 多个import可以使用小括号分组
第7行, 使用type定义自定义类型T, 底层为interface接口类型
第8行, 使用type定义自定义类型X, 底层为string
第9行, 使用type申明类型别名Y, 为string类型的别名

(注: type有两种格式, 一种是 申明别名 和 定义类型)

(注: 使用type定义的所有类型(非类型别名)都是不同的, 如:
type A string
type B string
type C string
A, B, C 的类型是不同的)

第11行, 使用func定义main函数, (可执行程序的入口函数)

第12,13,14行, 申明特定类型的变量, 并使用各类型的字面值进行赋值(不同类型的字面值可能不一样)

第16...20行, 使用导出的fmt包中的Println函数打印布尔值(==表达式的值为布尔类型)

第23行, //为注释符

第16行为什么输出false? 
接口值(t)与非接口值(x)也是可以比较的, Go语言规范里(https://golang.org/ref/spec#Comparison_operators):
A value x of non-interface type X and a value t of interface type T are comparable when values of type X are comparable and X implements T. They are equal if t's dynamic type is identical to X and t's dynamic value is equal to x.
意思是如果非接口值x实现了T接口, 而且接口值的动态类型与X类型相同, 动态值与x相等, 那比较结果就相等.
而这一行中, 接口值t的动态类型为string, 动态值为"abc"(第12行), 而非接口值x的类型为X, 类型都不相同, 动态值就不用比较了

第17行为什么输出true?
把==号后面的值转换为string类型, 再与接口值t的动态类型和动态值比较, 类型相同, 值相等, 返回true

第19行为什么输出true?
接口值t的动态类型和非接口值y的类型比较, 相同, 动态值与非接口值y的值比较, 相等, 返回true

第20行为什么输出true?
Y是string类型的别名, 所以string(y)和第19行的y一样, 都是string类型, 此行中的string()没有必要

来源go语言中文网

猜你喜欢

转载自blog.csdn.net/lengyue1084/article/details/107762622