文章插图
很遗憾,IDE 编辑器告诉我们 [10]int 不合法,必须是类型或类型指针!
可 [10]int 确实是我们需要的类型啊,既然报错也就是说Go 编译器不支持这种简化形式!
个人猜测可能是 struct 关键字不支持这种简化形式,那就去掉这个关键字好了!
文章插图
没想到真的可以!
至少现在看来 Go 编译器是支持简化形式的,至于这种支持的形式和我们预期实现的语义是否一致,暂时还不好说,继续做实验探索吧!
文章插图
通过声明变量后直接打印,初步证明了我们这种简化形式是可以正常工作的,输出结果也是我们定义的内部数组!
接下来看一看能不能对这个所谓的内部数组进行操作呢?
这种简化形式只有一个字段,只指明了字段的类型,没有字段名,因而访问该字段应该直接通过结构体变量访问,不知道这种猜测是否正确,依旧做实验来证明.
文章插图
这一次猜想也得到了验证,Go 编译器就是通过结构体变量直接操作内部字段,看来我们离真相更进一步!
先别急着高兴,将唯一的字段换成其他类型,多测试几遍看看是否依然正常?
文章插图
一番测试后并没有报错,很有可能这是 Go 所支持的结构体简化形式,也和我们的预期一致.
关于结构体属性的语法规则暂时没有其他探索的新角度,接下来开始探索结构体的方法.
探索的过程中要尽可能的设身处地思考 Go 语言应该如何设计才能方便使用者,尽可能地把自己想象成 Go 语言的设计者!
文章插图
结构体的简化形式下可能并不支持方法,如果真的是这样的话,这样做也有一定道理.
首先就语法层面分析,为什么单字段的结构体不支持方法?
还记得我们想要简化单字段结构体遇到的报错提示吗?
type MyArray struct [10]int如果直接将单字段类型放到 struct 关键字后面,Go 编译器就会报错,当我们省略 struct 关键字时上述报错自然就消失了.
从Go 编译器的角度上来讲,struct 是系统关键字,告诉编译器只要遇到这个关键字就解析成结构体语法,现在没有遇到 sruct 关键字也就意味着不是结构体语法.
这里关键字和结构体是一一对应关系,也就是充分必要条件,由关键字可以推测到结构体,由结构体也可以推测到关键字.
再回来看一看,我们的单字段结构体是怎么定义的呢?
type MyArray [10]int因为没有关键字 struct ,所以编译器推断 MyArray 不是结构体,既然不是结构体,也不能用结构体的接收者函数去定义方法.
文章插图
所以这种方法就会报错,由此可见 ,Go 语言如果真的不支持单字段结构体方法也有理可循.
然后我们再从语义的角度上解释一下为什么不支持方法?
回到探索的初衷,当正在定义的结构体有多个字段时,应该按照标准写法为每个字段指定字段的名称和类型.
假如该字段有且只有一个时,再按照标准写法定义当然可以,但也应该提供更加简化的写法.
只有一个字段的结构体,字段名称是没有意义的也是不应该出现的,因为完全可以用结构体变量所代替,此时这个结构体唯一有存在价值的就是字段的类型了!
字段类型包括内建类型和用户自定义结构体类型,不论哪种类型,这种简化形式的结构体的语义上完全可以由该结构体的字段类型所决定,所以简化形式的结构体还需要方法吗?
自然是不需要的!
字段类型可以由字段类型自己定义的,也能确保职责清晰,彼此分离!
综上,个人觉得即便 Go 真的不支持单字段结构体的方法,背后的设计还是有章可循的,有理可依的!
上文中定义动态数组时,内部使用的数组是静态数组,现在为了方便继续探索方法,应该提供重载方法使其支持动态数组.
文章插图
内部数组 arr 是静态数组,应该提供可以让外部调用者初始化指定数组的接口,按照已知的面向对象中关于方法的定义来重载方法.
推荐阅读
- 茶人必知六宗最
- 什么是Spring?
- TCP粘拆包详解与Netty代码示例
- 从零完成k3s Kubeconfig配置
- 梦到下山是什么意思啊 梦到下山路很陡很危险很难走
- 回溯 什么是Python回溯? Traceback
- 别人梦见我生小孩是什么征兆 别人梦见我生小孩
- 主板上到处都可以看到电容,每颗电容在每个电路作用是不一样的
- 亨利福特发展的制造技术是什么 亨利福特对汽车工业的贡献
- 什么是系统架构?