GoLang을 배우기 시작했으며 현재 짧은 변수 선언 구문을 사용하여 유형 유추 시스템에 대해 읽고 있습니다. 여기 Go에서 리터럴 유형 유추와 혼동
내 관심을 끌었 간단한 프로그램이며, 이해 좀 diffculty를 일으키는 :package main
import (
"fmt"
"sort"
)
type statistics struct {
numbers []float64
mean float64
median float64
}
// Performs analytics on a slice of floating-point numbers
func GenerateStats(numbers []float64) (stats statistics) {
stats.numbers = numbers
stats.mean = sum(numbers)/float64(len(numbers))
sort.Float64s(numbers)
stats.median = median(numbers)
return stats
}
// Helper function to sum up a slice of floats
func sum(numbers []float64) (total float64) {
for _, num := range numbers {
total += num
}
return total
}
// Helper to find the median of a sorted slice of floats
func median(numbers []float64) (med float64) {
n := len(numbers)
if n%2 == 0 {
med = numbers[n/2]
} else {
med = (numbers[n/2] + numbers[(n-1)/2])/2 // Infer 01
}
return med
}
func main() {
nums := []float64{1, 2, 3, 3, 4}
result := generateStats(nums)
fmt.Println(result.numbers)
fmt.Println(result.mean)
fmt.Println(result.median)
b := "This is Go" + 1.9 // Infer 02
fmt.Println(b)
}
내가 사용하는이 프로그램을 실행하면 : $ go run <path>/statistics.go
을
나는 다음과 같은 오류 메시지가 얻을 :
# command-line-arguments
<path>/statistics.go:47:20: cannot convert "This is Go" to type float64
<path>/statistics.go:47:20: invalid operation: "This is Go" + 1.9 (mismatched types string and float64)
다른 행동에 대한 이유는 다음과 같습니다.
Infer 01
: 숫자 리터럴 2
의 유형이 사용 된 표현식을 기준으로 유추됩니다. 분자 유형이 float64
이므로 Go는 해당 유형에 따라 2
을 가정하여 성공적으로 나누기를 수행합니다. 따라서 LHS의 변수 유형은 float64
입니다.
Infer 02
에 대해서도 동일한 추론을 사용했습니다. float 리터럴 유형 1.9
이 선언을 기반으로 유추됩니다. 그러나 float 리터럴은 암시 적으로 문자열로 변환되지 않는 한 문자열에 추가 할 수 없습니다. 따라서 변수 b
의 유형이 확실하지 않습니다. 따라서 오류가 발생해야합니다.
이제 오류 메시지로 혼동합니다.
왜 컴파일러는 암시 적으로 문자열 리터럴을 float64
유형으로 변환하려고합니까?
일반적인 의미에서 : 피연산자가 모두 리터럴 인 경우 컴파일러에서 유형을 어떻게 추론합니까? Go의 유형 추론 시스템을 더 잘 이해하는 데 도움이되는 훌륭한 자료는 무엇입니까?
Go는 수치 상수에 대해서만 리터럴 유형을 추론합니다. 그리고 숫자 형 ('int' 및'float'의 변형 및 별칭)에만 적용됩니다. 따옴표는 리터럴을 명시 적으로 문자열로 표시하고, 형식 유추가 필요하거나 수행되지 않습니다. – Kaedys
여기에서 특별한 특별한 것을 만드는 것은 _constants_가 처리되는 방법 (리터럴)입니다. 그들은 기본적으로 완전히 다른 언어로 행동합니다. Go의 블로그 https://blog.golang.org/constants에서 상수 및 기본 유형을 읽으십시오. (실제로 타입 유추에 대해서는별로 중요하지 않습니다 .2는 상수, 1.9 상수 부동 소수점이고 "foo"는 상수입니다.) 상수를 주목하십시오. – Volker
Kshitij 추론을 사용하고 있기 때문에 혼란스러워합니다. Go reasoning 사용 : Go 프로그래밍 언어 사양 : https://golang.org/ref/spec – peterSO