Skip to content

20210104golang的内置类型&内置函数&error(1)

ziyouzy edited this page Jan 4, 2021 · 2 revisions

首先请看文章:

https://www.cnblogs.com/emptyCup/p/12975154.html

内置类型只包含如下两种:

数值类型:int,string,数组等
引用类型:map,chan,切片等(对于这篇文章来说应该也包括func)

当初本以为为map,chan只是关键词,从而在这里造成了疑惑与不解,其是是这样的:

当初的总结没有错,只是因为文章里的书写方式不严谨:

比如说map,map不是引用类型,map只是关键词,而map[string]string才是一个引用类型
再比如chan,只有int64 chan才是数据类型

之前的总结没错,map,chan,func都只是构成数据类型的关键词,这文章简写后,对我造成了歧义

于是还是要继续探讨,这样的组合形式,到底该属于内置类型,还是该像结构类那样属于自定义类型呢?

我找到了个特别好的方法,内置类型和内置函数都适用:

那就是fmt.Printf("s1 type: %T\n", s1)打印出的结果如果是“s1 type: xxx.X”的形式,那么就都是自定义类型,如果是直接的type: int&type: []int的形式,那么就都是内置类型

这里也可以看出[]int也是数据类型

我们再去测试个map,只看打印结果就可以明白我想说明啥了:

testM type: map[string]int-----他是内置类型
testM type: map[string]main.S-----他是自定义类型,因为他包含了个自定义类型
testM type: map[string]*main.S-----同上

因此chan和func也会遇到同样的问题,他们在定义上会是多种元素组合而成,一但某个元素是自定义类型,那么他也就会属于自定义类型了

于是乎,这里也存在一个规律,那就是自定义类型都是程序员通过type关键词创造出来的,无论是type一个结构类,还是type一个map,切片,数字,还是一个没有field的函数

在说下type一个接口,type出的接口也是自定义类型,但是当他没有装入实现他的结构类时,打印的结果为空

fmt.Printf("i type: %T\n", i) i type: <nil>

然而另一方面,如果想实现一个接口,只能通过定义方法来做到,如果想要定义方法,又必须通过type先自定义一个类型,因此,当一个接口是装入数据的状态,那么他的打印结果很可能是个自定义类型

但是可不要忘了空接口的形式,接口是可以放入包括内置类型在内的所有数据类型的,因此也可以反向推倒得出结果,一个接口到底属于自定义类型还是内置类型,取决于向他放入了自定义类型还是内置类型

同时在日常使用时,接口经常会放入自定义类型,也经常会放入内置类型,都是很常规的操作

最后在来重申一遍:map,chan这些不是数据类型,而是关键词!

还有个要补充的:golang内置类型和内置函数是不需要引入包直接可用的!!!!!

Clone this wiki locally