9

私はGoで遊んでいて、Goで慣用的な型変換を実行するのが最善の方法だと思っていました。基本的に、私の問題は、、、、およびの間の自動型変換uint8uint64ありfloat64ます。他の言語での私の経験から、auint8とaを掛けると値uint64が得られuint64ますが、実際にはそうではありません。

これが私が作成した例であり、これがこのコードを書く慣用的な方法なのか、それとも重要な言語構成が欠落しているのかを尋ねます。

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の[]byte(string(i))uint8、[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 に答える