Go八股图文解读||变量常量篇(含java)

在go中常量是通过从const关键字声明的,变量使用var;而java通过final声明常量,不加这个关键字则为变量。

先从类型推断讲起

需要首先声明一点,可以理解为使用const所定义的常量与阿拉伯数字0到9所组成的数字为同一种东西,也就是常量为数字的别名

在go中设置了短变量声明的方式来帮助我们声明一个变量,甚至不需要我们定义变量的类型,go会自动识别并赋值,但这个自动识别是半智能的,也就是说go可以自动将不同类型常量计算所得值按照规律识别出来并赋给声明的变量,但是如果在计算表达式中出现了另一个变量变会失效,如下图所示:

此时编译器已经提醒我们报错信息:Invalid operation: c + 1.1 (cannot convert the constant 1.1 to the type int) 在这个示例中,c会被自动识别为int类型,而在d中int类型的c和1.1(浮点数类型)便会因为类型不同而发生错误。(但是要注意,这里说的是变量,至于常量当然与他不同)

而半智能的智能体现在哪些? 上面示例中,如果我们把c赋值为1.1 而 var d=c+1 时便不会报错,这是因为go会把常量1变为与c相同的类型,也就是说他不会把变量的值拿出来进行类型转换再接着赋值,而常量却可以。

在java中却不是这样,如下

对于变量而言,go禁止了不同类型之间的类型转换(只能显式的类型转换),而java会进行隐式类型转换(允许小范围自动转为大范围)。

补充一点,在go中int会根据不同的操作系统来决定大小,比如64位系统上为8字节,32位为4字节(java的int是4字节的)而类型为int64的变量甚至不能给64位操作系统上的int类型变量赋值。

特殊的常量

变量和常量:

go的常量部分比较特殊,变量不支持隐式类型转换,但是常量和变量之间却支持,如下

如果浮点数和整数类型大小相等甚至可以进行截断操作,把浮点数常量赋值给int型变量

常量和常量:

下面是一个比较经典的例子,如果操作数两端的“无状态”常量类型不同会按照 int<rune<float<Imag 的优先级进行类型判断

注意区分有状态常量和无状态常量

虽然o也会被识别为int类型,但是o本质上是无状态的,可以在表达式中隐式转换为浮点数,而i却不行,在d的表达式中会尝试把2.3转换为与 i 相同的int类型,于是便会遇到无法转换的错误

在java中常量都是有状态的都支持以上的操作

#牛客创作赏金赛#
Go八股文小解 文章被收录于专栏

Lotalot你干了什么?!没有golang八股文我们如何抗衡双招,Lotalot淡笑一声:“很简单,我自己写不就是了”说完,他气息终于不再掩饰,显露而出,Go八股文小解!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务