猿问

将浮点数分配给结构的整数元素

我正在参加巡回赛,我对 4/27 感到困惑(https://tour.golang.org/moretypes/4)


package main


import "fmt"


type Vertex struct {

    X int

    Y int

}


func main() {

    v := Vertex{1, 2}

    p := &v

    p.X = 1e9 // <- this line does not produce a type error

    fmt.Println(v) // {1000000000 2} implicite conversion of int to float?

}

我希望在 JavaScript 中做到这一点,而不是在强类型语言中。我一定错过了一些基本的东西。


慕村9548890
浏览 135回答 3
3回答

BIG阳

这一行:&nbsp;p.X&nbsp;=&nbsp;1e9是一个任务。Spec 对分配有以下要求:在赋值中,每个值都必须可以分配给它所分配的操作数的类型......以下可分配性规则涵盖了上述分配:x是一个无类型的常量&nbsp;,可由 type 的值表示T。1e9是一个无类型的浮点常量,并且该值可以由一个类型的值int精确表示,所以一切都很好。如果它是一个类型化的常量,那将是一个编译时错误,例如p.X&nbsp;=&nbsp;float64(1e9) //&nbsp;error:&nbsp;cannot&nbsp;use&nbsp;float64(1e+09)&nbsp;(type&nbsp;float64)&nbsp;as&nbsp;type&nbsp;int&nbsp;in&nbsp;assignment因为上述可分配性规则将不适用,所有其他规则也不适用。如果无类型浮点常量值不能用 type 的值表示,情况也是int如此,例如在这些情况下:p.X&nbsp;=&nbsp;1e99 //&nbsp;error:&nbsp;constant&nbsp;overflows&nbsp;int p.X&nbsp;=&nbsp;1.1 //&nbsp;error:&nbsp;constant&nbsp;1.1&nbsp;truncated&nbsp;to&nbsp;integer

鸿蒙传说

常量值由符文、整数、浮点数、虚数或字符串字面量表示,...数字常量表示任意精度的精确值并且不会溢出。常量可以有类型或无类型。文字常量 ... 是无类型的。在变量声明中使用时,可以隐式地为常量赋予类型……。如果常量值不能表示为相应类型的值,则这是错误的。type Vertex struct {&nbsp; &nbsp; X int&nbsp; &nbsp; Y int}v := Vertex{1, 2}p := &vp.X = 1e9 // <- this line does not produce a type error1e9是一个无类型的数字常量,表示为浮点文字。当无类型的数字常量1e9被分配给一个int变量 ( p.X, type Vertex {X int}) 时,它会int隐式地给定类型。1e9( 1,000,000,000) 可以表示为 type 的值int。

米脂

Go 编程语言规范/转换:转换可能按字面意思出现在源代码中,也可能由表达式出现的上下文暗示。Go 编程语言规范/数字类型之间的转换将浮点数转换为整数时,会丢弃小数(截断至零)。这里:p.x&nbsp;=&nbsp;1e9&nbsp;//&nbsp;it's&nbsp;floating&nbsp;literal&nbsp;with&nbsp;implied&nbsp;conversion&nbsp;by&nbsp;contexthttps://golang.org/ref/spec#Conversions
随时随地看视频慕课网APP

相关分类

Go
我要回答