golang文档中对type有说明:
命名类型,有类型名称如 int, int64, float, string, bool. 还有自定义的命名类型。
非命名类型,没类型名称 []string, map[string]string, [4]int. 当比较两个命名类型的时候,类型名称必须一样;当比较命名类型和非命名类型的时候,底层类型一样即可。
import (
"fmt"
"reflect"
)
type T1 []string
type T2 []string
func main() {
foo0 := []string{}
foo1 := T1{}
foo2 := T2{}
fmt.Println(reflect.TypeOf(foo0))
fmt.Println(reflect.TypeOf(foo1))
fmt.Println(reflect.TypeOf(foo2))
// Output:
// []string
// main.T1
// main.T2
// foo0 can be assigned to foo1, vice versa
foo1 = foo0
foo0 = foo1
// foo2 cannot be assigned to foo1
// prog.go:28: cannot use foo2 (type T2) as type T1 in assignment
// foo1 = foo2
}