220

私が試してみました:

const ascii = "abcdefghijklmnopqrstuvwxyz"
const letter_goodness []float32  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }

最初の宣言と初期化は正常に機能しますが、2 番目、3 番目、4 番目は機能しません。

float の const 配列を宣言して初期化するにはどうすればよいですか?

4

4 に答える 4

312

配列は本質的に不変ではありません。あなたはそれを一定にすることはできません。

あなたが得ることができる最も近いものは次のとおりです:

var letter_goodness = [...]float32 {.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697, .0015, .0077, .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098, .0236, .0015, .0197, .0007 }

[...]の代わりに注意してください[]:スライスの代わりに(固定サイズの)配列を確実に取得します。したがって、値は固定されていませんが、サイズは固定されています。

于 2012-10-30T11:00:47.843 に答える
82

効果的なゴーから:

Go の定数はまさに定数です。関数でローカルとして定義されている場合でも、コンパイル時に作成され、数値、文字 (ルーン)、文字列、またはブール値のみを使用できます。コンパイル時の制限により、それらを定義する式は、コンパイラによって評価可能な定数式でなければなりません。たとえば、1<<3は定数式ですが、 は実行時にmath.Sin(math.Pi/4)関数呼び出しを行う必要があるためではありません。math.Sin

スライスと配列は実行時に常に評価されます。

var TestSlice = []float32 {.03, .02}
var TestArray = [2]float32 {.03, .02}
var TestArray2 = [...]float32 {.03, .02}

[...]配列自体の長さを計算するようにコンパイラに指示します。スライスは配列をラップし、ほとんどの場合、より簡単に操作できます。定数を使用する代わりに、小文字の最初の文字を使用して、他のパッケージから変数にアクセスできないようにします。

var ThisIsPublic = [2]float32 {.03, .02}
var thisIsPrivate = [2]float32 {.03, .02}

thisIsPrivate定義されているパッケージでのみ使用できます。外部からの読み取りアクセスが必要な場合は、単純な getter 関数を記述できます ( golang の Getters を参照)。

于 2012-10-30T13:30:06.203 に答える
15

Go には配列定数のようなものはありません。

Go 言語仕様からの引用: 定数:

ブール定数ルーン定数整数定数浮動小数点定数複素定数文字列定数があります。ルーン定数、整数定数、浮動小数点定数、複素定数をまとめて数値定数と呼びます。

定数式(定数の初期化に使用される) には、定数オペランドのみを含めることができ、コンパイル時に評価されます。

仕様には、さまざまなタイプの定数がリストされています。許可された型の 1 つを基になる型として持つ型の定数式を使用して、定数を作成および初期化できることに注意してください。たとえば、これは有効です。

func main() {
    type Myint int
    const i1 Myint = 1
    const i2 = Myint(2)
    fmt.Printf("%T %v\n", i1, i1)
    fmt.Printf("%T %v\n", i2, i2)
}

出力 ( Go Playgroundで試してください):

main.Myint 1
main.Myint 2

配列が必要な場合は、変数のみを使用できますが、定数は使用できません。

定数に関する次の素晴らしいブログ記事をお勧めします:定数

于 2015-03-31T10:01:26.153 に答える
7

他の人が述べたように、これには公式の Go 構造はありません。私が想像できる最も近いものは、スライスを返す関数です。このようにして、元のスライスの要素を誰も操作しないことを保証できます (配列に「ハードコード」されているため)。

スライスを短くして...短くしました...:

func GetLetterGoodness() []float32 {
    return []float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}
于 2016-12-22T17:58:57.650 に答える