2017-10-18 7 views
3

私はゴランを学んでいます。私は少しのデータを保存しようとしていますが、それをファイルに送信します。ゴランはデータを保存する辞書のリストに相当します

このpythonブロックのgolangに相当するものは何ですか? (dictsのリスト)

friends = [ 
    { 
    "name":"James", 
    "age":44, 
    }, 
    { 
    "name":"Jane", 
    "age":47, 
    }, 
] 

マップまたは構造体のスライスを使用する方がよいでしょうか?

データをフィルタリングして(45歳以上のすべての友人など)データを並べ替えることができます(私は12以上のレコードがあると想像してもらいたい)。それを画面に印刷します。

+4

直接比較は、マップのスライスではなく、実際のなしでしょう私たちはどちらが良いと言うことができない問題。 – JimB

答えて

3

Pythonでdictを使用する多くの使用例では、静的型付けを取得するためにGoでの構造体が必要です。あなたのケースでは、これは私には、構造体のスライスのようになります。

type Friend struct{ 
    Name string `json:"name"` 
    Age int `json:"age"` 
} 

をして、あなたがlistのPuuhonの相当sliceある[]*Person

2

にデシリアライズ/シリアライズすることができ、両方が同じ意味を持っており、ケースを使用しています。

しかし、何をスライスに入れるのですか?それはあなたの言葉によって異なります。同じフィールドの場合は、structを使用することをおすすめします。上記のようなフィールドを与えます。場合によっては、異なるキーと異なる文字列値を保存する必要があります。それを文字列のマップ文字列として定義します。

map[string]string 

最後に、動的に型指定されたマップを作成する可能性があります。しかし、それはあなたが静的なタイピングのすべての利点を失うので、それを過度に使用することではありません。プログラムのエラーが起こりやすく、速度が遅くなります。

type Friend struct { 
    Name string 
    Age int 
} 

var friends []Friend = make([]Friend, 0) 

今のあなたはすでにそのスライスに友人を追加したとしましょう、:あなたのサンプルデータは、(友人が自分の性質を共有する)均質であるように思われるようにと、あなたは、slicestructのSを使用することができます考える

1

あなたは、いくつかの数よりも大きいAgeを有するものをフィルタリングすることができます。

func filterFriendsAboveAge(allFriends []Friend, minAge int) []Friend { 
    results := make([]Friend, 0) 
    for _, friend := range allFriends { 
     if friend.Age > minAge { 
      results = append(results, friend) 
     } 
    } 
    return results 
} 

この関数を呼び出すことによって、返されたスライス内の友達の値は、元のコピーとなりますのでご注意ください。アイデンティティを保持する必要がある場合は、代わりにポインタを使用します。ここで

1

は何をしたいん小さなサンプルプログラムです:

package main 

import (
    "fmt" 
    "sort" 
) 

type friend struct { 
    name string 
    age int 
} 

func main() { 
    friends := []friend{ 
     {"James", 44}, 
     {"Jane", 47}, 
     {"Bob", 30}, 
     {"Cesar", 90}, 
     {"John", 45}, 
    } 

    over45 := filterFriends(friends, func(f friend) bool { 
     return f.age > 45 
    }) 
    fmt.Println("over 45:", over45) 

    // note that sort.Sort will change the contents of the slice; if you want 
    // to keep the original order as well, you would first have to copy that 
    // slice and sort the copy 
    sort.Sort(byAge(friends)) 
    fmt.Println("sorted by age:", friends) 
} 

// filterFriends takes your slice and a predicate to filter by, then returns a 
// newly allocated list of friends that made it through the filter. 
func filterFriends(friends []friend, pred func(friend) bool) []friend { 
    var fit []friend 
    for _, f := range friends { 
     if pred(f) { 
      fit = append(fit, f) 
     } 
    } 
    return fit 
} 

// byAge implements the sort.Interface so we can pass it to sort.Sort. 
type byAge []friend 

func (f byAge) Len() int   { return len(f) } 
func (f byAge) Less(i, j int) bool { return f[i].age < f[j].age } 
func (f byAge) Swap(i, j int)  { f[i], f[j] = f[j], f[i] } 

プログラムの出力は次のとおりです。

over 45: [{Jane 47} {Cesar 90}] 
sorted by age: [{Bob 30} {James 44} {John 45} {Jane 47} {Cesar 90}] 
関連する問題