go语言命名(named)类型与非命名类型(unnamed)

首先看下下面的代码
文件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

结论是 命名类型不能赋值给命名类型
非命名类型可以赋值给命名类型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容