golang 的字面值与类型转换,来猜猜结果

2017-09-08 12:16:38 +08:00
 lizon
package main

import "fmt"

func main() {
 a := 1
 b := 3
 
 fmt.Printf("%T\n", a / b)
 fmt.Printf("%T\n", a / 3)
 fmt.Printf("%T\n", a / 3.0)
 fmt.Printf("%T\n", 1 / 3)
 fmt.Printf("%T\n", 1 / 3.0)
}

答案: https://play.golang.org/p/mgxFyXtzGv

2200 次点击
所在节点    Go 编程语言
29 条回复
sjj050121014
2017-09-08 12:41:20 +08:00
感觉没什么特别啊
sjj050121014
2017-09-08 12:44:05 +08:00
不好意思,没看清,确实有特别,变量除小数,居然还是整形
sjj050121014
2017-09-08 12:49:04 +08:00
https://play.golang.org/p/nJs3oLSwyZ 加了个 c:=3.0,这个居然编译错误
secondwtq
2017-09-08 12:56:35 +08:00
第一反应:golang 你个浓眉大眼的居然也叛变了

@sjj050121014 3# 这个才正常
frye
2017-09-08 13:20:21 +08:00
没看出来有任何问题,为啥这么大惊小怪?
Kisesy
2017-09-08 13:23:06 +08:00
var a int = 3.0
fmt.Println(a)

楼主是想说这个?
topbandit
2017-09-08 13:25:16 +08:00
为神马会这样?
fwee
2017-09-08 13:27:04 +08:00
看来编译器对 int 字面量有特殊的转换处理... 不过 go 本来就不是很严谨的语言,一直没搞懂怎么优雅的提供一个 bool 的饮用
kofj
2017-09-08 13:29:29 +08:00
@Kisesy 没准儿 Po 主真这么想的
XIVN1987
2017-09-08 13:34:54 +08:00
为啥会这样??谁能解释一下!
rrfeng
2017-09-08 13:35:19 +08:00
var a int
var b float

a / b -> type error

在算式中的字面量会按照算式其他变量的类型进行 cast,而不是字面量的默认类型。

```
type A int

func main() {
var a A
a = 10
fmt.Printf("%T\n", a/"abc")
fmt.Printf("%T\n", a/3.0)
}
```
rrfeng
2017-09-08 13:37:15 +08:00
可以说是在不同的操作符(复制操作、运算操作)下,对字面量进行类型判定的方式是不一样的。

这没有任何问题,并不是对 int 有特殊处理。

哪里的出来的 go 不是很严谨的语言……
88250
2017-09-08 13:40:49 +08:00
gamexg
2017-09-08 14:27:31 +08:00
golang 不会进行自动的类型转换,整数只能除以整数,不会自动转换成为浮点数,字面量类型是根据所在位置来决定的。

第三个位置需要一个整数,3.0 是合法的整数,没有报错。附言里面的 3.1 不是合法整数,炸了正常。

运行结果看起来符合预期。
rrfeng
2017-09-08 15:38:18 +08:00
本质上是 var a int = 3.0 是一个合法的操作。
这点去别的语言对比一下看看吧。
jadeity
2017-09-08 16:32:48 +08:00
3.0 从数学上来说应该是整数吧?有些语言把带小数点的字面量当成浮点型,go 在这个地方当成整数。也说不上谁对谁错,习惯不一样。
kiddult
2017-09-08 16:51:56 +08:00
@jadeity 极少会有把 3.0 当整数的语言吧,a / 3.0 和 1 / 3.0 结果不一样有点反应不过来
Yoock
2017-09-08 16:55:25 +08:00
go 所有的类型转换都需要是显示的,所以报错也很正常。
jadeity
2017-09-08 17:01:04 +08:00
@kiddult 我印象中 go 这个语言好像特别重视格式这方面的内容,要让这些“习惯”“失效”。
lizon
2017-09-08 18:06:16 +08:00
@rrfeng 我希望 a / 3.0 的时候报类型错误,也不要把 3.0 不声不响的当成 int 处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389157

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX