2015-12-18 13 views
6

私はちょうどGoLangから始まり、チュートリアル(https://golang.org/doc/code.html)の1つを見ています。GoLangの構造

これらの例の1つでは、変数を構造体に設定しますが、以下のforループで構造体の要素にアクセスする方法については混乱していますか?誰かが明らかにすることができますか?どうもありがとう!

コード:以下

package stringutil 

import "testing" 

func TestReverse(t *testing.T) { 
    cases := []struct { 
     in, want string 
    }{ 
     {"Hello, world", "dlrow ,olleH"}, 
     {"Hello, 世界", "界世 ,olleH"}, 
     {"", ""}, 
    } 
    for _, c := range cases { 
     got := Reverse(c.in) 
     if got != c.want { 
      t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) 
     } 
    } 
} 
+0

についての詳細を見つけることができ、彼らは構造体のスライスにそれを設定しています。 –

答えて

7

は、この内の各文の役割を明確にするのに役立ついくつかのコメントとコードです。

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つの文字列をそれぞれinwantに割り当てます(名前を使用しない場合は、定義と同じです)。ブレースの外側のペアはスライス用です。あなたのスライスがintや文字列であった場合は、myInts := []int{5,6,7}のような入れ子の余分なレベルを使わずに値を取得するだけです。

{ 
     {"Hello, world", "dlrow ,olleH"}, 
     {"Hello, 世界", "界世 ,olleH"}, 
     {"", ""}, 
    } 
+0

コードはどのようにしてc.inとc.outを介して構造体の文字列にアクセスできますか? – thegreenfrog

+1

@thegreenfrogループは構造体のスライスを反復していますが、3つあります。 '{" Hello、world "、" dlrow、olleH "}の各行は、インスタンス化しています。 'for _、c:= range cases'は多かれ少なかれforeachループです。私は' 'cases''の' 'each case' 'のように読みます。 '.'は一般的にアクセス演算子(Goとは別の特定の名前があるかどうか不明)と呼ばれ、構造体のプロパティにアクセスするために使用します。いくつかのフィールド 'One'、' Two'、および 'Three'を持つ' A'構造体がいくつかある場合、それらのフィールドには 'A'型のインスタンスからアクセスします。これは' a.One'、 'a' 2つ、3つ。 – evanmcdonnal

+0

さらなる説明が必要な場合は、私はその答えを拡大することができます。アクセス演算子を使い慣れていない場合は、ほぼすべての言語で使用されているので、オブジェクト指向プログラミングに関するいくつかの一般的な読書を行うことをお勧めします。 – evanmcdonnal

1

構造体とは何かの根をとってください。

あなたはあなたの変数を宣言するので、 を関数から使用することができます。 例:

package main 

import (
    "fmt" 

) 

func main() { 
    Get() 

} 

func Get(){ 
    out := new(Var) 

    out.name = "james" 

    fmt.Println(out.name) 
} 
type Var struct { 
    name string 
} 
0

あなたは彼らが構造体に変数を設定していないGolang Struc

 
// GO language program with an example of Struc Type 

package main 

import (
"fmt" 
) 

func main() { 
    type Salary struct{ 
     Basic, HRA, TA float64  
    } 

    type Employee struct{ 
     FirstName, LastName, Email string 
     Age int 
     MonthlySalary []Salary 
    } 

    e := Employee{ 
     FirstName: "Mark", 
     LastName: "Jones", 
     Email: "[email protected]", 
     Age: 25, 
     MonthlySalary: []Salary{ 
      Salary{ 
       Basic:15000.00, 
       HRA:5000.00, 
       TA:2000.00, 
      }, 
      Salary{ 
       Basic:16000.00, 
       HRA:5000.00, 
       TA:2100.00, 
      }, 
      Salary{ 
       Basic:17000.00, 
       HRA:5000.00, 
       TA:2200.00, 
      }, 
     }, 
    } 
    fmt.Println(e.FirstName,e.LastName) 
    fmt.Println(e.Age) 
    fmt.Println(e.Email) 
    fmt.Println(e.MonthlySalary[0]) 
    fmt.Println(e.MonthlySalary[1]) 
    fmt.Println(e.MonthlySalary[2]) 
} 
関連する問題