2014-05-14 126 views
-1

我試圖創建隨機等級並將它們添加到test_scores數組。然後計算平均值。不匹配的類型float64和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/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) 
} 

唯一的區別是,在最後一行,我m使用固定的5和非工作人員,我正在使用len(test_scores)呼叫。

Len還返回一個整數,所以怎麼了?

+3

你通常應該使用切片而不是數組。 – JimB

+0

「這個程序崩潰」是無益的。提問時請包含更多信息。 [我已將錯誤信息編輯爲您的問題。] –

回答

3

當您直接在名爲常量的源代碼中編寫5時。寫作true也是如此。唯一的區別是前者是無類型常數,後者是類型不變。

不同之處在於,有沒有關於應該有–什麼類型true它永遠是bool但在5這不是那麼明顯,取決於上下文的情況下歧義。

Go編譯器會找出什麼類型來給編譯上的常量。詳細情況在​​中描述。

編輯:

我意識到,有一個在我的答案是錯誤:true根據規格其實也無類型,因爲其中一個類型從bool派生預計可以在任何地方使用。這意味着:

type MyBool bool 

func DoNothing(b MyBool) {} 

DoNothing(true) // true is coerced to MyBool 

雖然答案仍然有效。有類型和無類型常量之間的區別成立。

+0

關於常量的另一個有用的信息來源是[The Go博客:常量](https://blog.golang.org/constants)。 –

4

float64int是不同的類型,但在特定情況下允許轉換。 (http://golang.org/ref/spec#Conversions

代碼中的字面值5是無類型常量(http://golang.org/ref/spec#Constants),正確的類型由編譯期間的表達式確定。

只需使用float64(len(test_scores))

+0

是的,我知道這一點。我想知道爲什麼'5'工作,並且'len(test_scores)'不會因爲'len()'返回一個整數而'5'是一個整數。 – sergserg

+2

增加了對常量的引用。通讀規格。它非常平易近人,並會回答所有這些細節。 – JimB

-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。

+0

不,編譯器將它們視爲無類型常量,它只是在'fmt.Printf()'中計算時將它們轉換爲本地'int'和'float64' – JimB