は、この内の各文の役割を明確にするのに役立ついくつかのコメントとコードです。
import "testing"
func TestReverse(t *testing.T) {
cases := []struct { // declaration of anonymous type
in, want string // fields on that type called in and want, both strings
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
} // composite literal initilization
// note the use of := in assigning to cases, that op combines declaration and assignment into one statement
for _, c := range cases { // range over cases, ignoring the index - the underscore means to discard that return value
got := Reverse(c.in) // c is the current instance, access in with the familiar dot notation
if got != c.want { // again, access operator on c, the current instance
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) // more access
}
}
}
これが役立つかどうかを教えてください。話し言葉で要約をもっと与えてみたり、文章の中には意味をなさないものがあれば詳細を追加したりすることができます。また、コレクションの範囲「範囲」に慣れていない場合は、k, v
を返します。k
はインデックスまたはキー、v
の値です。
EDIT:cases
cases := []struct {
in, want string
}
中括弧の最初のペア内部このビットの宣言/ initilizationの詳細は、構造体の定義です。これは匿名型ですが、通常の宣言は次のようになります。あなたはこのような何かを持っていた場合
type case strcut {
in string
want string
}
は、このパッケージのスコープ内でcase
と呼ばれるタイプが存在することになる(あなたはそれが国民ではなくtype Case
する必要がありますので、作りたいと思った場合、エクスポートされません)。代わりに、structの例は匿名です。これは通常の型と同じように動作しますが、開発者はその型を参照する方法がないため、ここで初期化されたコレクションでのみ実際に作業できます。内部的には、この型はフィールドに2つの非文字列を持つ他の構造体と同じです。フィールドの名前はin
およびwant
です。ここでの割り当てではcases := []struct
の[]
の前にstruct
の前にこの匿名型のスライスを宣言していることに注意してください。
この次の小さなビットは、静的初期化と呼ばれます。これはコレクションに型を初期化するための構文です。 {"", ""}
のようなこれらのネストされたビットのそれぞれは、これらの匿名構造体のうちの1つの宣言および初期化であり、中括弧によって再び示される。この場合、空の2つの文字列をそれぞれin
とwant
に割り当てます(名前を使用しない場合は、定義と同じです)。ブレースの外側のペアはスライス用です。あなたのスライスがintや文字列であった場合は、myInts := []int{5,6,7}
のような入れ子の余分なレベルを使わずに値を取得するだけです。
{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
についての詳細を見つけることができ、彼らは構造体のスライスにそれを設定しています。 –