質問: "Hello" みたいな ```
回答: channel そのものと、channel に送信された値とを区別してください。構造体のフィールドに channel を代入しても、その channel に送信された値がそのフィールドへ代入されるわけではありません。 初期化された構造体の一部を更新したい場合、並列処理は関係なく単にそのフィールドへ後から代入すれば良いです。Go では struct の初期化時に省略されたフィールドはゼロ値で初期化されることに注意してください。 ``` sObj := SampleObject{} update(&sObj) // または // sObj.SampleField = newValue() // または *SampleObject のメソッドとして定義して // sObj.update() ``` 複数の更新をしなければならず、またそれらを並列的に処理して意味があるのであれば、たとえば sync パッケージを使って並列的に処理する方法が考えられます。下のコードでは Mutex を使って排他処理させつつ、WaitGroup を使って全ての更新が終わったことを検知しています。 この処理と同様のことは channel だけでも表現できますが、sync パッケージを使った方が見やすいかなと個人的には感じます。また、下のコードでは簡単のために Mutex のロック範囲を struct 全体にしていますが、フィールドごとにしても良いですし、依存関係が無いならロックしなくても平気です。 ``` type SampleObject struct { X int Y int m sync.RWMutex } // 引数はポインタであることに注意 func update1(wg *sync.WaitGroup, sObj *SampleObject) { defer wg.Done() // 重い処理 sObj.m.Lock() sObj.X = 42 sObj.m.Unlock() } func update2(wg *sync.WaitGroup, sObj *SampleObject) { defer wg.Done() // 重い処理 sObj.m.Lock() sObj.Y = 43 sObj.m.Unlock() } func main() { sObj := SampleObject{} var wg sync.WaitGroup // 各々の更新が終わったことを確認する用 wg.Add(1) go update1(&wg, &sObj) wg.Add(1) go update2(&wg, &sObj) wg.Wait() // 全ての更新が終了するまで待つ // ...その後の処理... } ```