在设计程序时:
会存在简单内置类型
也会存在非简单内置类型(通过type,struct,chan,func等胶水关键词组合而成)
但是不会存在简单自定义类型(程序员最多只可以通过type newI int或type aliasI =int为一个内置简单/非简单类型,创造出一个自定义类型,或者类型别名)
而是会存在非简单自定义类型(即使是type newI int这样的操作,newI也会是一个自定义类型了)
同时自定义类型也不会局限于借助type关键词实现:
int chan
map[string]int
f func(int)error
首先接口类型一定是非简单类型,就算是内置类型,golang的源代码也是需要type HandlerFunc() interface{}这样的操作的
重点在于,定义出一个变量后,使用%T打印type时,会打印出nil
你可以会先入为主的理解成,接口和简单属于类型一样,定义后就会同时完成初始化,只不过初始化的值为0,但是请看下面的实例:
news :=newS{}
var i I
//i =news
//fmt.Printf("news type: %T\n", news)
fmt.Printf("i type: %T\n", i)
fmt.Println("i value: ", i)
i =news
fmt.Printf("i type: %T\n", i)
fmt.Println("i value: ", i)
i type: <nil>
i value: <nil>
i type: main.newS
i value: {0 0}
所以说接口是个十分特殊的存在,在没有被赋值一个实现他的类型前,他的类型和值都为nil
而其他的类型,只要实例化完成后都至少会%T出他是什么,即使是map也是:
var testmap map[string]string
fmt.Printf("testmap type: %T\n", testmap)
fmt.Println("testmap value: ", testmap)
testmap type: map[string]string
testmap value: map[]
1.接口是非简单数据类型
2.当接口仅仅完成初始化操作时,他的type和value都为nil,因此从表象上看,所有不同类型的接口,初始化值都是相同的,但是这没有什么意义
3.当给一个接口变量真正第一次赋值操作后,他的type和value都会发生变化
似乎接口和其他任何数据类型相比,都是更加底层的一层