2021010420210104golang的内置类型&内置函数&error(3)内置类型是否为内置函数,内置接口的统称 - ziyouzy/2021blog GitHub Wiki
这里有篇不错的文章,做了底层逻辑上更为清晰的归纳与总结:
https://jingyan.baidu.com/article/db55b6093e77aa4ba30a2f38.html
大致思路如下:
数据类型的第一种区分方式,可以分为简单类型与非简单类型,依照以下原则,除1之外都是非简单类型:
1.简单数据类型:整型、浮点型、布尔类型、字符串。
2.数组(array)、切片(slice)、映射(map)。
3.结构体(struct)。
4.接口(interface{})。
5.指针。
第二种区分方式是基于能否不通过导包直接使用
1.内置数据类型
2.自定义数据类型
在实际运用过程中两者会经常出现逻辑上的重叠
其实还有第三种方式,就是通过fmt.Printf("type: %T\n")的方式
以及第四种,被程序员type出来的和不是被程序员type出来的
但是第三种和第四种是否合理呢?
其实本质是这样的:
1.非简单类型都是由简单类型组合而成的,在这组合过程中,存在着一些诸如map,chan,func,struct,interface这样的关键词,充当着类似“胶水”的角色
但是他们都是关键词,而不是数据类型
2.内置数据类型是golang语言自身设计的数据类型,简单数据类型都是他自身所设计的,同时他也设计不少非简单内置数据类型
如type error interface{}
以及之前学习过的http包里的HandlerFunc(w,r)函数数据类型,同时他也是被type出来的
3.还有就是byte是type byte uint8出来的
所以说以第三种和第四种为出发点区分数据类型是一条错误的路,正确的路应该是基于先1后2足以:
也就是说,数据类型分为简单类型和非简单类型,他们的相同之处在于,无论是语言自身所设计(内置数据类型)的还是程序员自己设计的(自定义数据类型),都跳不出简单类型和非简单类型的天花板。
同时这个天花板也比想象中的更小,因为简单数据类型一定会是内置类型,也会导致程序员只能设计出自定义数据类型,继续推导可以再次总结出,程序员只能设计出非简单类型
结论是程序员只能设计出自定义类型和非简单类型
而type只是个关键词,和map,chan,func,struct,interface一样在需要他的时候会充当胶水的角色,从此之外他没有什么区分数据类型的意义和价值
同时通过fmt.Printf("type: %T\n")的方式也没有意义,他只会反映出设计后的结果