不匹配的类型float64和int

时间:2014-05-14 13:50:56

标签: arrays go

我尝试创建随机成绩并将其添加到test_scores数组中。然后计算平均值。

这个程序:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    i := 0
    var test_scores [5]float64
    for i < len(test_scores) {
        test_scores[i] = rand.Float64()
        i++
    }
    fmt.Println(test_scores)

    var total float64 = 0
    i = 0
    for i < len(test_scores) {
        total += test_scores[i]
        i++
    }
    fmt.Println(total)
    fmt.Println(total / len(test_scores))
}

产生

main.go:24: invalid operation: total / 5 (mismatched types float64 and int)

这个很好用:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    i := 0
    var test_scores [5]float64
    for i < len(test_scores) {
        test_scores[i] = rand.Float64()
        i++
    }
    fmt.Println(test_scores)

    var total float64 = 0
    i = 0
    for i < len(test_scores) {
        total += test_scores[i]
        i++
    }
    fmt.Println(total)
    fmt.Println(total / 5)
}

唯一的区别是,在最后一行中,我使用的是固定5,而在非工作时,我使用len(test_scores)来电。

Len也会返回一个整数,那么它是什么?

3 个答案:

答案 0 :(得分:4)

float64int是不同的类型,但在特定情况下允许转换。 (http://golang.org/ref/spec#Conversions

代码中的文字5是无类型常量(http://golang.org/ref/spec#Constants),正确的类型由编译期间的表达式决定。

只需使用float64(len(test_scores))

即可

答案 1 :(得分:3)

当你直接在源代码中写5时,它被称为常量。写true同样如此。唯一的区别是前者是无类型常量,后者是类型常量。

不同之处在于true应该具有的类型没有歧义 - 它始终是bool但在5的情况下&#{1}} 39;不那么明显,取决于背景。

Go编译器将确定在编译时给出常量的类型。有关详细信息,请参阅Go's language specification

编辑:

我意识到我的答案中存在错误:true实际上也是根据规范进行的无类型操作,因为它可以用于预期来自bool的类型的任何地方。这意味着:

type MyBool bool

func DoNothing(b MyBool) {}

DoNothing(true) // true is coerced to MyBool

但答案仍然有效。类型和非类型常量之间的区别成立。

答案 2 :(得分:-1)

这一行

fmt.Printf("%T\n", total)
fmt.Printf("%T\n", 5)
fmt.Printf("%T\n", 5.0)
fmt.Printf("%T\n", len(test_scores))

打印

float64
int
float64
int

也许编译器会将5视为5.0 ..无论如何,你应该使用转换为float64。