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)
}
可能这样效果更明显一些吧
package main
import "fmt"
func main() {
 a := 1
 
 fmt.Println(a / 3)
 fmt.Println(a / 3.0)
 //fmt.Println(a / 3.1) 类型错误
}
https://play.golang.org/p/nAD0aFC9re
我觉得 a / 3.0 的时候编译错误更好,沿用其他语言的习惯这里容易掉坑里
|  |      1sjj050121014      2017-09-08 12:41:20 +08:00 感觉没什么特别啊 | 
|  |      2sjj050121014      2017-09-08 12:44:05 +08:00 不好意思,没看清,确实有特别,变量除小数,居然还是整形 | 
|  |      3sjj050121014      2017-09-08 12:49:04 +08:00 https://play.golang.org/p/nJs3oLSwyZ 加了个 c:=3.0,这个居然编译错误 | 
|  |      4secondwtq      2017-09-08 12:56:35 +08:00 via iPhone | 
|      5frye      2017-09-08 13:20:21 +08:00 没看出来有任何问题,为啥这么大惊小怪? | 
|  |      6Kisesy      2017-09-08 13:23:06 +08:00 var a int = 3.0 fmt.Println(a) 楼主是想说这个? | 
|  |      7topbandit      2017-09-08 13:25:16 +08:00 为神马会这样? | 
|      8fwee      2017-09-08 13:27:04 +08:00 看来编译器对 int 字面量有特殊的转换处理... 不过 go 本来就不是很严谨的语言,一直没搞懂怎么优雅的提供一个 bool 的饮用 | 
|  |      10XIVN1987      2017-09-08 13:34:54 +08:00 为啥会这样??谁能解释一下! | 
|  |      11rrfeng      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) } ``` | 
|  |      12rrfeng      2017-09-08 13:37:15 +08:00 可以说是在不同的操作符(复制操作、运算操作)下,对字面量进行类型判定的方式是不一样的。 这没有任何问题,并不是对 int 有特殊处理。 哪里的出来的 go 不是很严谨的语言…… | 
|  |      1388250      2017-09-08 13:40:49 +08:00 | 
|  |      14gamexg      2017-09-08 14:27:31 +08:00 via Android golang 不会进行自动的类型转换,整数只能除以整数,不会自动转换成为浮点数,字面量类型是根据所在位置来决定的。 第三个位置需要一个整数,3.0 是合法的整数,没有报错。附言里面的 3.1 不是合法整数,炸了正常。 运行结果看起来符合预期。 | 
|  |      15rrfeng      2017-09-08 15:38:18 +08:00 本质上是 var a int = 3.0 是一个合法的操作。 这点去别的语言对比一下看看吧。 | 
|      16jadeity      2017-09-08 16:32:48 +08:00 3.0 从数学上来说应该是整数吧?有些语言把带小数点的字面量当成浮点型,go 在这个地方当成整数。也说不上谁对谁错,习惯不一样。 | 
|  |      18Yoock      2017-09-08 16:55:25 +08:00 go 所有的类型转换都需要是显示的,所以报错也很正常。 | 
|  |      20x8 OP @rrfeng 我希望 a / 3.0 的时候报类型错误,也不要把 3.0 不声不响的当成 int 处理 | 
|  |      21rrfeng      2017-09-08 18:13:59 +08:00 @lizon  前面说的很明白了,字面量要确定类型的时候跟其所处的位置有关 https://play.golang.org/ 报错是: cannot convert "a" to type A 并不是把 3.0 不声不响的当作 int 处理,而是因为算式中的另外一个操作数是 int 类型。 体会一下: var a string = "haha" a + 3.0 //报什么错? 规则就是:如果算式中有一个操作数是字面量,那么就根据另一个操作数的类型来 cast,成功就计算,不成功就报错。 | 
|  |      22xrlin      2017-09-08 18:20:26 +08:00 golang 的字面值是没有类型的,赋值或者运算操作才判断类型,不过这确实有点不符合大部分语言的逻辑。 | 
|      23keenwon      2017-09-08 18:25:50 +08:00 | 
|  |      24x8 OP @rrfeng  a := 3.0 fmt.Printf("%T\n", a) 推导 a 的类型为 float64 https://play.golang.org/p/0VEgW1QOgk 这里 cast 为 float 的依据呢 | 
|  |      25reus      2017-09-08 18:38:04 +08:00 没什么奇怪的,po 主不知道 go 里 const 的概念吧。 3.0 是 const,需要是 int,就转换成 int,需要是 float64,就转换成 float64。 | 
|  |      26reus      2017-09-08 18:43:11 +08:00  1 | 
|  |      27rrfeng      2017-09-08 18:43:38 +08:00 赋值操作符下的 cast  其他操作符下的 cast 为什么会觉得这两者应该一样呢? |