首先看下下面的代码
文件interview.go
package main
type T int
func F(t T) {
}
type T1 []int
func F1(t T1) {
}
type T2 []int
func F2(t T2) {
}
文件interview_test.go
package main
import (
"fmt"
"testing"
)
func TestF(t *testing.T) {
var q int
F(q) // 不能编译
}
func TestF1(t *testing.T) {
var q []int
F1(q) // 可以编译
fmt.Printf("hello test %v\n", q)
}
func TestF2(t *testing.T) {
var q []int
F2(q) // 没问题
var q1 T1
F2(q1) // 无法编译 原因是q1是命名类型T1 而F2的参数要求是命名类型T2 命名类型 = 命名类型 不允许赋值操作
}
go语言类型有个命名类型和非命名类型
用type命名了都是命名类型
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
他们都用type定义过了所以命名了
非命名类型
slice
map
array
func
chan
结论是 命名类型不能赋值给命名类型
非命名类型可以赋值给命名类型