Go のポインター レシーバーによる単純型の値の変更
ポインター レシーバー メソッドによる単純型の値の変更は、 Go の一般的なタスク。ただし、このコンテキストでポインターがどのように動作するかを理解することが重要です。
提供された例では:
<br>type FooInt int</p> <p>func (fi *FooInt ) FromString(i 文字列) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp
}
ポインターがレシーバーとして渡されると、そのポインターのコピーがメソッド内で作成されます。メソッド内のコピーに加えられた変更は、元のポインターには影響しません。
コード スニペットの *fi は、FromString メソッドに渡される fi ポインターのコピーです。 &tmp を *fi に割り当てると、基本的に元の fi ポインターではなく、コピーの値が変更されます。
元のポインターの値を変更するには、次のいずれかを行う必要があります。
新しいポインタ値を返します:
<br> func (fi <em>FooInt) FromString(i string) </em>FooInt {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp
}
非 nil を渡す変更する値へのポインタ:
<br> func (fi <em>FooInt) FromString(i string, p </em>*FooInt) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp
}
受信側が nil でないことを確認します:
<br> func (fi *FooInt) FromString(i string ) {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> num, _ := strconv.Atoi(i) *fi = FooInt(num)
}
レシーバーが有効なポインターであることを確認し、メソッド内でポイントされた値を変更することで、ポインター レシーバーを介して元の単純型の値を効果的に変更できます。 .
以上がGo でポインター レシーバーを使用して単純な型の値を変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。