Golang プログラミングを使用する場合、配列、スライス、マップ、チャネルなどのデータ構造を走査するために使用される range キーワードをよく使用します。ただし、走査プロセス中に、走査された要素を変更したい場合、いくつかの問題が発生します。この記事では、range を使用して配列、スライス、マップ、チャネルの要素を変更する方法について説明します。
配列とスライスを走査する場合、range キーワードは要素自体ではなく要素のコピーを返します。したがって、要素を変更したい場合は、要素のポインタを使用する必要があります。以下は、配列要素とスライス要素を変更するコード例です。
arr := [3]int{1, 2, 3} for i := range arr { temp := &arr[i] *temp = *temp*2 } slice := []int{1, 2, 3} for i := range slice { temp := &slice[i] *temp = *temp*2 }
一時変数 temp は、要素のポインターを保存し、ポインターを介して要素の値を変更するためにコード内で使用されます。
マップを移動する場合、range キーワードは要素自体ではなく、キーと値のペアのコピーを返します。したがって、要素を変更したい場合は、キーを使用して要素にアクセスし、その値を変更する必要があります。以下は、マップ要素を変更するコード例です。
oldMap := map[string]int{"a": 1, "b": 2, "c": 3} newMap := make(map[string]int) for k, v := range oldMap { newMap[k] = v*2 }
コードでは、マップを移動するときに、キーを使用して要素にアクセスし、その値を変更します。マップ内の要素の値を変更するときにポインターを使用する必要がないことに注意してください。
チャネルを移動する場合、range キーワードは要素自体ではなく、要素のコピーを返します。したがって、チャネル内の要素を変更する場合は、チャネルの送信操作を使用してチャネル内の値を変更する必要があります。以下は、チャネル内の要素を変更するコード例です。
ch := make(chan int, 3) ch <- 1 ch <- 2 ch <- 3 for i := range ch { ch <- i*2 }
コードでは、チャネルの送信操作を使用して、要素の値を元の値の 2 倍に変更します。チャネル内の要素を変更する場合、チャネルの送信操作を使用して、変更された値をチャネルに送信する必要があることに注意してください。
概要:
range キーワードを使用して配列、スライス、マップ、チャネルを走査する場合、走査された要素を変更したい場合は、要素のポインタ (配列とスライス)、キーを使用して要素 (マップ) にアクセスするか、チャネルの送信操作を使用して要素の値 (チャネル) を変更します。 range を使用して要素を変更する場合は、ループ内で無限ループや競合状態などの問題が発生しないように注意する必要があることに注意してください。
以上がrange を使用して配列/スライス/マップおよびチャネルの要素を変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。