go中的别名类型和潜在类型

type MyString = string

这条声明语句表示,MyString是string类型的别名类型。顾名思义,别名类型与其原类型恐怕只是名称上,它们是完全相同的。源类型与别名类型是一对概念,是两个对立的称呼。别名类型主要是为了代码重构而存在的。

如果像下面这样定义:

type MyString2 string // 注意,这里没有等号。

MyString2和string就是两个不同的类型了。这里的MyString2是一个新的类型,不同于其他任何类型。

示例:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var v1 string
	v1 = "123456"
	type MyString=string
	var v2 MyString
	v2 = "2222"

	// reflect
	fmt.Println("v1 type:", reflect.TypeOf(v1))   //输出  v1 type: string
	fmt.Println("v2 type:", reflect.TypeOf(v2))   //输出  v2 type: string

	var v3 string
	v3 = "123456"
	type MyString2 string
	var v4 MyString2
	v4 = "2222"

	// reflect
	fmt.Println("v3 type:", reflect.TypeOf(v3))   //输出  v3 type: string
	fmt.Println("v4 type:", reflect.TypeOf(v4))   //输出  v4 type: main.MyString2
}

对于这里的类型再定义来说,string可以被称为MyString2的潜在类型。潜在类型的含义是:某个类型在本质上是哪个类型,或者是哪个类型 的集合。

如果两个值潜在类型相同,却属于不同类型,他们之间是可以进行类型转换的。因此,MyString2类型的值与string类型的值,可以使用类型转换表达式进行互转。

	var v3 string
	v3 = "123456"
	type MyString2 string
	var v4 MyString2
	v4 = "2222"

	// reflect
	fmt.Println("v3 type:", reflect.TypeOf(v3))   //输出  v3 type: string
	fmt.Println("v4 type:", reflect.TypeOf(v4))   //输出  v4 type: main.MyString2
	fmt.Println("v4 type:", reflect.TypeOf(string(v4))) // 输出  v4 type: string

但对于集合类的类型[]MyString2与[]string来说这样做却是不合法的,因为[]MyString2与[]string的潜在类型不同,分别是MyString2与string.

即使两个类型的潜在类型相同,他们的值之间也不能进行判断或比较,他们的变量之间也不能互相赋值。

猜你喜欢

转载自blog.csdn.net/qq_20867981/article/details/86304014