ホームページ > バックエンド開発 > Golang > ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?

ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?

藏色散人
リリース: 2021-09-17 19:48:39
転載
2298 人が閲覧しました

この記事は、go language チュートリアル コラムで ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? Pointer ポインタの 11 の知識を紹介するもので、困っている友人の役に立てば幸いです。

ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?

ポインタは、優れたコードを書く上で最も重要な部分の 1 つです。この記事では、ポインターとは何か、そして ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? でのポインターの使用方法について説明します。

1. ポインタとは何ですか?

ポインタは、それが指すアドレスを格納する変数です。特定の型のポインターは、その型のみを指すことができます (データ型は不変です)。

2. ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?Lang ポインター構文

ポインターの構文は非常に単純です。以下は、ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? でのポインター宣言の構文です。

var ptr *typevar ptrint *int     // 指向 int 的指针
ログイン後にコピー

ポインタのゼロ値は nil です。

#3. ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? でのポインターの初期化

型ポインターは、

&:

package mainimport (
    "fmt")func main() {
    var q int = 42
    var p *int     // declare the pointer
    p = &q         // initialize the pointer
    fmt.Println(p)  // 0x40e020}
ログイン後にコピー

## を使用して初期化されます。 #4. ポインタ値の移動ポインタ値とは、ポインタが保存したアドレスの値を取得することを意味します。以下は、

# 演算子を使用してポインター値操作を実行する例です: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">package mainimport (     &quot;fmt&quot;)func main() {     var q int = 42     var p *int     p = &amp;q     fmt.Println(p)  // 0x40e020     fmt.Println(*p) // 42}</pre><div class="contentsignin">ログイン後にコピー</div></div>

5. ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?Lang## のポインターのポインター#ポインタのアドレスは数値であり、他の変数にも代入できます。したがって、間接的なレベルを作成できます。このような間接的なレベルは、不必要な混乱を引き起こす可能性があるため、慎重に使用してください。
package mainimport (
    "fmt")func main() {   
    i := 64
    j := &i  // j 是 int 类型的指针
    k := &j  // k 是存放指针地址的指针,也是 int 类型

    fmt.Println(i)  // 64

    fmt.Println(j)  // 0x40e020 

    fmt.Println(*j) // 64 (value inside that address)

    fmt.Println(k)  // 0x40c138

    fmt.Println(*k) // 0x40e020 (address of j)}
ログイン後にコピー

6. インターフェイスへのポインター

ポインターは、インターフェイスを含むあらゆるものを指すことができます。空のインターフェイスを使用する場合、戻り値は nil

です。

package mainimport (
    "fmt")func main() {   
    var a interface{}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // <nil>}</nil>
ログイン後にコピー
次に、ポインターを使用したインターフェイスの使用例を示します。
package mainimport (
    "fmt")// 定义接口type Bird interface{
    fly()}type B struct{
    name string}// 实现它func (b B)fly() {
    fmt.Println("Flying...")}func main() {   
    var a Bird = B{"Peacock"}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // {Peacock}}
ログイン後にコピー
ここで

"a"

は構造体型 Bird であり、ご覧のとおり、インターフェイス型として使用されます。これはポリモーフィズムの使用です。 ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? ではインターフェイスを使用したポリモーフィズムが可能であるため、構造体またはインターフェイスへのポインターが ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? では不可欠なツールであることがわかります。

7. 関数パラメータとしてのポインタ

ポインタは関数のパラメータとして使用できます。値を直接使用する場合に比べて、いくつかの利点があります。ポインタを引数として使用することは、 大きなオブジェクトを関数に渡す非常に効率的な方法です。したがって、これを使用すると、大幅な最適化が行われます。

package mainimport (
    "fmt")//声明指针参数func f(a *int) {
    fmt.Println(*a)}func main() {   
    var a int = 42

    // 传递地址
    f(&a) // 42}
ログイン後にコピー

大きなオブジェクトを使用すると、実行時間が遅くなる可能性があります。これは、構造体へのポインターを渡す例です。これは、大きなオブジェクトを処理する効率的な方法です。

package mainimport (
    "fmt")type Human struct {
    name string
    age int
    place string}func f(h *Human) {
    fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)}func main() {   
    john := Human{"John", 36, "Las Vegas"}

    f(&john) // The user John is 36 years old and he is from Las Vegas}
ログイン後にコピー
構造体を逆参照するときは注意してください。 #**structname.field1

のように使用すると、エラーがスローされます。

正しい

メソッドは

(*structname).field1 です。 関数内でポインタを使用すると、パラメータが const でない限り、値は "mutable" になります。そのため、値を変更する場合は常に、その値へのポインタを関数として使用する必要があります。パラメータを変更し、必要な変更を加えます。

8. ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? の "new" 関数

ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? の

new 関数は、型へのポインターを返します。
package mainimport (
    "fmt")func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67}
ログイン後にコピー

9. 関数からポインタを返す

他の値と同様に、関数からは任意のタイプのポインタを返すことができます。とてもシンプルです。値を直接返すのではなく、値のアドレスを返します。

package mainimport (
    "fmt")func p() *int {  // 将返回类型指定为指针
    v := 101

    // 返回地址
    return &v}func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101}
ログイン後にコピー

10. 関数へのポインター

関数へのポインターは ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? で暗黙的に機能します。これは、ポインタとして宣言する必要がないことを意味します。

package mainimport (
    "fmt")func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f    pf() // 一个函数}
ログイン後にコピー

11. ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? でポインターを使用するときに覚えておくべきこと

ゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか? ではポインター演算は許可されません。したがって、C/C のように単項インクリメントやデクリメントなどの演算を実行することはできません。

配列へのポインターを使用したい場合もありますが、スライスを使用する方が良い選択肢です。スライスは配列へのポインタよりもはるかに多用途です。コードは非常に簡潔なので、作業が簡単になります。したがって、可能な限りスライスを使用してください。

元のアドレス: https://golangdocs.com/pointers-in-golang


翻訳アドレス: https://learnku.com/go/t/60880

以上がゴーポインターとは何ですか?習得する必要がある知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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