私はGoLangの学習を始めました。現在、短い変数宣言構文を使用して型推論システムについて読んでいます。Goでのリテラルの型推論との混乱
:私は、次のエラーメッセージが表示されます$ go run <path>/statistics.go
、
:私は使用してこのプログラムを実行すると
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)
}
:ここ
は私の注意を引いたし、私の理解では、いくつかのdiffcultyを引き起こしている単純なプログラムです
# 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
と同じ推論を使用しました。 浮動小数点型の型1.9
は、宣言に基づいて推論されます。ただし、暗黙的に文字列に変換されない限り、浮動小数点定数を文字列に追加することはできません。したがって、私は変数b
のタイプについては不明です。したがって、エラーが発生する必要があります。
今、私はエラーメッセージで混乱しています。
なぜコンパイラは文字列リテラルをfloat64
タイプに暗黙的に変換しようとしますか?
一般的には、両方のオペランドがリテラルの場合、コンパイラはどのように型を推測しますか? Goの型推論システムをより良く理解するのに役立つリソースはありますか?
Goは、実際には数値定数に対してのみ、そして数値型( 'int'と' float'の変形とエイリアス)に対してのみ、リテラルの型を推論します。また、引用符はリテラルを文字列として明示的にマークすることに注意してください。型推論の必要性や完了はありません。 – Kaedys
ここで特別な特別なことは、_constants_がどのように扱われるか(リテラル)です。基本的には、他の言語とはまったく異なっています。 Goのブログhttps://blog.golang.org/constantsで定数とそのデフォルトタイプを読んでください。 (実際には型推論についてはあまりよくありません.2は定数int、1.9は定数float、定数stringは "foo"です) – Volker
Kshitij推論を使用しているので混乱します。 Go推論を使用する:Goプログラミング言語仕様:https://golang.org/ref/spec – peterSO