ホームページ > バックエンド開発 > Golang > Goで文字列のスライスを文字列へのポインタのスライスに正しく変換するにはどうすればよいですか?

Goで文字列のスライスを文字列へのポインタのスライスに正しく変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-19 20:22:17
オリジナル
690 人が閲覧しました

How to Correctly Convert a Slice of Strings to a Slice of Pointers to Strings in Go?

文字列のスライスを文字列へのポインタのスライスに変換する方法

文字列のスライスを扱う場合、多くの場合、変換が必要になります。それらを文字列へのポインタのスライスに変換します。これにより、基になる文字列値に毎回逆参照する必要がなく、直接アクセスできるようになります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート