我在玩Go,想知道在Go中执行惯用类型转换的最好方法是什么。基本上,我的问题在于uint8
、uint64
和float64
之间的自动类型转换。根据我使用其他语言的经验,uint8
与uint64
的乘积将产生uint64
值,但在go中不是这样。
这是我构建的一个示例,我问这是不是编写这段代码的惯用方式,或者我是否遗漏了一个重要的语言构造。
package main
import ("math";"fmt")
const(Width=64)
func main() {
var index uint32
var bits uint8
index = 100
bits = 3
var c uint64
// This is the line of interest vvvv
c = uint64(math.Ceil(float64(index * uint32(bits))/float64(Width)))
fmt.Println("Test: %v\n", c)
}
在我看来,由于所有的显式类型转换,上限值的计算似乎不必要地复杂。
谢谢!
发布于 2012-11-14 04:41:09
非常量值没有隐式类型转换。
你可以写
var x float64
x = 1
但是你不能写
var x float64
var y int
y = 1
x = y
有关参考,请参阅the spec。
有一个很好的理由,不允许自动/隐式类型转换,因为它们可能会变得非常混乱,并且必须学习许多规则来规避可能发生的各种警告。以Integer Conversion Rules in C为例。
发布于 2012-11-14 21:07:41
例如,
package main
import "fmt"
func CeilUint(a, b uint64) uint64 {
return (a + (b - 1)) / b
}
func main() {
const Width = 64
var index uint32 = 100
var bits uint8 = 3
var c uint64 = CeilUint(uint64(index)*uint64(bits), Width)
fmt.Println("Test:", c)
}
输出:
Test: 5
发布于 2020-07-05 15:23:20
为@nemo补充一个很棒的答案。C中数值类型之间的自动转换带来的混乱盖过了它带来的便利。参见https://Golang.org/doc/faq#conversions。这就是为什么你甚至不能隐式地从int转换成int32。参见https://stackoverflow.com/a/13852456/12817546。
package main
import (
. "fmt"
. "strconv"
)
func main() {
i := 71
c := []interface{}{byte(i), []byte(string(i)), float64(i), i, rune(i), Itoa(i), i != 0}
checkType(c)
}
func checkType(s []interface{}) {
for k, _ := range s {
Printf("%T %v\n", s[k], s[k])
}
}
byte(i)
创建一个值为71的uint8,[]byte(string(i))
a []uint8为71,float64(i)
float64 71,i
int 71,rune(i)
int32 71,Itoa(i)
string 71,i != 0
一个布尔值为true。
由于Go不会自动转换数值类型(请参阅https://stackoverflow.com/a/13851553/12817546),因此您必须手动在类型之间进行转换。参见https://stackoverflow.com/a/41419962/12817546。注意,Itoa(i)设置"Integer to an ASCII“。请参阅https://stackoverflow.com/a/10105983/12817546中的注释。
https://stackoverflow.com/questions/13367979
复制相似问题