文字列のスライスを文字列へのポインタのスライスに変換する方法
文字列のスライスを扱う場合、多くの場合、変換が必要になります。それらを文字列へのポインタのスライスに変換します。これにより、基になる文字列値に毎回逆参照する必要がなく、直接アクセスできるようになります。
First Attempt
これを実現する 1 つのアプローチは、文字列のスライスを作成し、各文字列のアドレスを新しいスライスに追加します。ただし、ループ変数 v が各反復で割り当てられ、その値は変更されるがアドレスは変更されないため、これは期待どおりに機能しません。その結果、すべてが同じアドレスを指すポインタのスライスが作成されます。
values1 := []string{"a", "b", "c"} var values2 []*string for _, v := range values1 { fmt.Printf("%p | %T\n", v, v) values2 = append(values2, &v) } fmt.Println(values2) // Output: // %!p(string=a) => string // %!p(string=b) => string // %!p(string=c) => string // [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0]
正しい解決策
ポインタのスライスを正しく作成するには文字列に、元のスライスの適切なスライス要素のアドレスを追加する必要があります:
for i := range values1 { values2 = append(values2, &values1[i]) }
この場合、ループ変数 i は、元のスライスにインデックスを付けるために使用され、values2 に追加された各アドレスが、values1 の一意の文字列に対応するようにします。
代替ソリューション
代替ソリューション一時的なローカル変数を作成し、それらのアドレスを追加します。
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
このアプローチは、元のスライスや行われた変更とは独立しています。値 1 への変更は値 2 には影響しません。
以上がGoで文字列のスライスを文字列へのポインタのスライスに正しく変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。