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.
即使两个类型的潜在类型相同,他们的值之间也不能进行判断或比较,他们的变量之间也不能互相赋值。