9

我在玩 Go,想知道在 Go 中执行惯用类型转换的最佳方法是什么。基本上我的问题在于uint8,uint64float64. 根据我对其他语言的经验,auint8与 a的乘法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)
}

从我的角度来看,由于所有显式类型转换,上限值的计算似乎不必要的复杂。

谢谢!

4

3 回答 3

6

非常量值没有隐式类型转换。

你可以写

var x float64
x = 1

但是你不能写

var x float64
var y int

y = 1
x = y

请参阅规范以供参考。

不允许自动/隐式类型转换是有充分理由的,因为它们可能会变得非常混乱,并且必须学习许多规则来规避可能出现的各种警告。以C 中的整数转换规则为例。

于 2012-11-13T20:41:08.897 回答
1

例如,

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
于 2012-11-14T13:07:41.287 回答
1

添加到@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))一个具有 [71] 的 []uint8、float64(i)float64 71、iint 71、rune(i)int32 71、Itoa(i)字符串 71 和i != 0一个值为 true 的 bool。

由于 Go 不会为您自动转换数字类型(请参阅https://stackoverflow.com/a/13851553/12817546),您必须手动在类型之间进行转换。请参阅https://stackoverflow.com/a/41419962/12817546。注意,Itoa(i) 设置一个“整数到 ASCII”。请参阅https://stackoverflow.com/a/10105983/12817546中的评论。

于 2020-07-05T07:23:19.730 回答