2014-05-14 6 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. 유일한 차이점은 전자는 유형이 지정되지 않았으며 상수이고 후자는 유형이 상수라는 것입니다.

이 차이는 항상 bool 수 있습니다 –해야 어떤 종류의 true 약하지만 그리 명확하지 그리고 상황에 따라 5의 경우에는 모호함이 없다는 것을에 자리 잡고 있습니다.

Go 컴파일러는 컴파일시 상수에 어떤 유형을 제공할지 알아냅니다. 자세한 내용은 Go's language specification에 설명되어 있습니다.

편집 :

내가 내 대답에 실수가 있다는 것을 깨달았다 bool에서 파생 타입이 예상되는 곳은 어디든지 이용 될 수 있기 때문에 true은 사양에 따라 사실도 지정되지 않은 것입니다. 의미는 다음과 같습니다.

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()'은 정수를 반환하고'5'는 정수를 반환하기 때문에'len (test_scores)'는하지 않습니다. – 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

관련 문제