首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go中的惯用类型转换

Go中的惯用类型转换
EN

Stack Overflow用户
提问于 2012-11-14 04:10:31
回答 3查看 3.6K关注 0票数 9

我在玩Go,想知道在Go中执行惯用类型转换的最好方法是什么。基本上,我的问题在于uint8uint64float64之间的自动类型转换。根据我使用其他语言的经验,uint8uint64的乘积将产生uint64值,但在go中不是这样。

这是我构建的一个示例,我问这是不是编写这段代码的惯用方式,或者我是否遗漏了一个重要的语言构造。

代码语言:javascript
运行
复制
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)
}

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

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-14 04:41:09

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

你可以写

代码语言:javascript
运行
复制
var x float64
x = 1

但是你不能写

代码语言:javascript
运行
复制
var x float64
var y int

y = 1
x = y

有关参考,请参阅the spec

有一个很好的理由,不允许自动/隐式类型转换,因为它们可能会变得非常混乱,并且必须学习许多规则来规避可能发生的各种警告。以Integer Conversion Rules in C为例。

票数 6
EN

Stack Overflow用户

发布于 2012-11-14 21:07:41

例如,

代码语言:javascript
运行
复制
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)
}

输出:

代码语言:javascript
运行
复制
Test: 5
票数 1
EN

Stack Overflow用户

发布于 2020-07-05 15:23:20

为@nemo补充一个很棒的答案。C中数值类型之间的自动转换带来的混乱盖过了它带来的便利。参见https://Golang.org/doc/faq#conversions。这就是为什么你甚至不能隐式地从int转换成int32。参见https://stackoverflow.com/a/13852456/12817546

代码语言:javascript
运行
复制
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中的注释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13367979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档