0

私のmain関数は、ファイルから json を読み取り、それを構造体にアンマーシャリングして、別の構造体型に変換し、標準出力を介してフォーマットされた JSON を吐き出します。

ループに同時実行性を追加するために、ゴルーチンとチャネルを実装しようとしていforます。

func main() {
    muvMap := map[string]string{"male": "M", "female": "F"}
    fileA, err := os.Open("serviceAfileultimate.json")
    if err != nil {
        panic(err)
    }
    defer fileA.Close()

    data := make([]byte, 10000)
    count, err := fileA.Read(data)
    if err != nil {
        panic(err)
    }

    dataBytes := data[:count]

    var servicesA ServiceA
    json.Unmarshal(dataBytes, &servicesA)
    var servicesB = make([]ServiceB, servicesA.Count)
    goChannels := make(chan ServiceB, servicesA.Count)

    for i := 0; i < servicesA.Count; i++ {
        go func() {
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Address").SetString(Merge(&servicesA.Users[i].Location))
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Date_Of_Birth").SetString(dateCopyTransform(servicesA.Users[i].Dob))
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Email").SetString(servicesA.Users[i].Email)
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Fullname").SetString(Merge(&servicesA.Users[i].Name))
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Gender").SetString(muvMap[servicesA.Users[i].Gender])
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Phone").SetString(servicesA.Users[i].Cell)
            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Username").SetString(servicesA.Users[i].Username)
            goChannels <- servicesB[i]
        }()
    }

    for index := range goChannels {
        json.NewEncoder(os.Stdout).Encode(index)
    }

}

コンパイルされますが、次のようなメッセージが返されます。

goroutine 1 [chan receive]: main.main() C://.....go.94 +0x55b.
4

1 に答える 1

1

含まれているデータではなく、チャネル情報を印刷しています。ループは必要ありません。受信してから印刷したいだけです。

   json := <-index
   json.NewEncoder(os.Stdout).Encode(json)

ここで、コードがブロックされないことを指摘する必要があります。すべての作業が完了するまで読み続けたい場合は、何らかのロック/調整メカニズムが必要です。

のようなものをよく見かけます。

for {
   select {
        case json := <-jsonChannel:
            // do stuff
        case <-abort:
            // get out of here 
   }
}

それに対処する。また、チャンネルをデフォルトの容量で初期化しています(つまり、バッファリングされたチャンネルです)が、これはかなり奇妙です。このトピックに関するいくつかのチュートリアルを確認することをお勧めします。全体的な設計には、実際には非並行実装の改善であるいくつかの作業が必要です。最後に、この作業の一部を抽象化するためのライブラリを見つけることができます。ほとんどの人はおそらくそうすることをお勧めします。以下に例を示します。https://github.com/lytics/squaredance

于 2015-06-19T18:12:36.740 に答える