2021010420210104golang的内置类型&内置函数&error(4)单独探讨接口 - ziyouzy/2021blog GitHub Wiki

先总结下之前的思路:

在设计程序时:
会存在简单内置类型
也会存在非简单内置类型(通过type,struct,chan,func等胶水关键词组合而成)
但是不会存在简单自定义类型(程序员最多只可以通过type newI int或type aliasI =int为一个内置简单/非简单类型,创造出一个自定义类型,或者类型别名)
而是会存在非简单自定义类型(即使是type newI int这样的操作,newI也会是一个自定义类型了)

同时自定义类型也不会局限于借助type关键词实现:

int chan
map[string]int
f func(int)error

这些也都是自定义类型,同时也是非简单类型

type关键词需要的时候就用,不需要的时候就不用

现在开始单独探讨接口:

首先接口类型一定是非简单类型,就算是内置类型,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都会发生变化

似乎接口和其他任何数据类型相比,都是更加底层的一层

⚠️ **GitHub.com Fallback** ⚠️