文章插图
初次尝试方法的重载就遇到了问题,报错提示该方法已声明,所以说 Go 可能并不支持方法重载,这样就有点麻烦了.
想要实现类似的功能要么通过定义不同的方法名,要么定义一个非常大的函数,接收最全的参数,再根据调用者参数进行对应的逻辑处理.
用惯了方法的重载,突然发现这种特性在 Go 语言中无法实现,顿时有点沮丧,和其他主流的面向对象语言差异性也太大了吧!
不支持构造函数,不支持方法重载,原来以为理所应当的特性并不理所应当.
还是先冷静下来想一想,Go 为什么不支持方法重载呢?难不成和构造函数那样,怕是滥用干脆禁用的逻辑?
因为我不是设计者,无法体会也不想猜测原因,但可以肯定的是,Go 语言是一门全新的语言,有着独特的设计思路,不与众人同!
吐槽时间结束,既然上了贼船就得一条道走到黑,不支持方法重载就换个函数名或者按参数名区分.
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464C4T-14.jpg)
文章插图
天啊撸,刚刚解决方法重载问题又冒出数组初始化不能是变量只能是常量表达式?
简直不可思议!
既然数组初始化长度只是常量表达式,也就无法接收外部传递的容量 cap,没有了容量只能接收长度 len ,而初始化内部数组长度又没办法确定了,两个变量都无法对外暴露!
一切又回到原点,想要实现动态数组的功能只能靠具体的方法中去动态扩容和缩容,不能初始化指定长度了.
这样的话,关于方法也是一条死路,停止探索.
声明结构体结构体定义基本已经探索完毕,除了发现一种单字段结构体的简化形式外,暂时没有新的发现.
再次回到使用者的角度上,声明结构体有没有其他方式呢?
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464A195-15.jpg)
文章插图
这是变量的声明方式,除了这种形式,还记得在学习 Go 的变量时曾经介绍过声明并初始化变量方式,是否也适用于结构体变量呢?
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464A233-16.jpg)
文章插图
编译器没有报错,证明这种字面量形式也是适用的,不过空数据结构没有太大的意义,怎么能初始化对应的结构呢?
和多字段结构体最为相似的数据结构莫过于映射 map 了!
回忆一下 map 如何进行字面量初始化的吧!
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464CB8-17.jpg)
文章插图
模仿这种结构看看能不能对结构体也这么初始化,果然就没有那么顺利!
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/0146461a0-18.jpg)
文章插图
我还没定义,你就不行了?
IDE 编辑器提示字段名称无效,结构体明明就有 len 字段啊,除非是没有正确识别!
"len" 与 len 是不一样的吧?
那就去掉双引号 "" 直接使用字段名进行定义看看.
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464Ba8-19.jpg)
文章插图
此时报错消失了,成功解锁一种新的隐藏技能.
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/0146463J9-20.jpg)
文章插图
除了这种指定字段名称注入方式,能不能不指定字段名称而是按照字段顺序依次初始化?
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/01464A328-21.jpg)
文章插图
借助编辑器可以看到确实是按照顺序注入的,这样的话,其实有点意思了,明明不支持构造函数,采用字面量实例化时却看起来像构造函数的无参,有参数和全参形式?
可以预想到的是,这种全参注入的方式一定是严格按照定义顺序相匹配的,当参数不全时可能按位插入也可能不支持,真相如何,一试便知!
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/0146464061-22.jpg)
文章插图
事实上并不支持这种参数不全的形式,因此个人觉得要么无参要么全参要么指定初始化字段这三种语义上还是比较清楚的.
除了字面量的方式,Go 是否支持创建 slice 或 map 时所使用的 make 函数呢?
![go语言封装是怎么回事](http://img.jiangsulong.com/220405/0146461918-23.jpg)
文章插图
看样子,make 函数并不支持创建结构体,至于为什么不支持,原因就不清楚了,也是个人的一个疑惑点.
既然 make 可以创建 slice ,map 这种内建类型,语义上就是用来创建类型的变量,而结构体也是一种类型,唯一的差别可能就是结构体大多是自定义类型而不是内建类型.
如果我来设计的话,可能会一统天下,因为语义上一致的功能只使用相同的关键字.
推荐阅读
- 茶人必知六宗最
- 什么是Spring?
- TCP粘拆包详解与Netty代码示例
- 从零完成k3s Kubeconfig配置
- 梦到下山是什么意思啊 梦到下山路很陡很危险很难走
- 回溯 什么是Python回溯? Traceback
- 别人梦见我生小孩是什么征兆 别人梦见我生小孩
- 主板上到处都可以看到电容,每颗电容在每个电路作用是不一样的
- 亨利福特发展的制造技术是什么 亨利福特对汽车工业的贡献
- 什么是系统架构?