我尝试创建随机成绩并将其添加到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也会返回一个整数,那么它是什么?
答案 0 :(得分:4)
float64
和int
是不同的类型,但在特定情况下允许转换。 (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。