ホームページ > バックエンド開発 > Golang > Go言語のポインタに関する11の知識を詳しく解説

Go言語のポインタに関する11の知識を詳しく解説

青灯夜游
リリース: 2022-10-27 19:19:09
転載
3155 人が閲覧しました

ポインタは、優れたコードを書く上で最も重要な部分の 1 つです。この記事では、ポインターとは何か、そして Go でのポインターの使用方法について説明します。

Go言語のポインタに関する11の知識を詳しく解説

#1. ポインタとは

ポインタは、アドレスを格納する 変数 です。を指します (数値を格納する単なる変数であることを強調します)。 [関連する推奨事項: Go ビデオ チュートリアル ]

特定の型のポインターは、その型のみを指すことができます (ポインターが指すデータ型は不変です)。

2. GoLang ポインター構文

ポインターの構文は非常に単純です。以下は、Go でのポインター宣言の構文です。

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

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

3. Go でのポインターの初期化

型ポインターは、&:

package main

import (
    "fmt"
)

func main() {
    var q int = 42
    var p *int     // declare the pointer
    p = &q         // initialize the pointer
    fmt.Println(p)  // 0x40e020
}
ログイン後にコピー
## を使用して初期化されます。

#4. Go ポインタ値

ポインタ値とは、ポインタが保存したアドレスの値を取得することを意味します。次の例は、

# 演算子を使用してポインター値操作を実行する例です:

package main

import (
    "fmt"
)

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

5. 内のポインターへのポインターGoLang

ポインタのアドレスは数値であり、この数値は他の変数に代入することもできます。したがって、間接的なレベルを作成できます。このような間接的なレベルは、不必要な混乱を引き起こす可能性があるため、慎重に使用してください。

package main

import (
    "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 main

import (
    "fmt"
)

func main() {   
    var a interface{}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // <nil>
}
ログイン後にコピー
次に、ポインターを使用したインターフェイスの使用例を示します。

package main

import (
    "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" struct 型 Bird で、ご覧のとおり、インターフェイス型として使用されます。これはポリモーフィズムの使用です。 Go では interfaces を使用してポリモーフィズムを実現できるため、構造体またはインターフェイスへのポインターが Go では不可欠なツールであることがわかります。

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

ポインタは、

functions

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

package main

import (
    "fmt"
)

//声明指针参数
func f(a *int) {
    fmt.Println(*a)
}

func main() {   
    var a int = 42

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

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

import (
    "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. Go の "new" 関数

Go の new 関数は、型へのポインターを返します。

package main

import (
    "fmt"
)

func main() {   
    ptri := new(int)
    *ptri = 67

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

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

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

import (
    "fmt"
)

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

    // 返回地址
    return &v
}

func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101
}
ログイン後にコピー

10. 関数へのポインター

関数へのポインターは Go で暗黙的に機能します。これは、ポインタとして宣言する必要がないことを意味します。
package main

import (
    "fmt"
)

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

11. Go でポインターを使用するときに覚えておくべきこと

Go ではポインター演算は許可されていません。したがって、C/C のように単項インクリメントやデクリメントなどの演算を実行することはできません。 配列へのポインターを使用したい場合もありますが、スライスを使用する方が良い選択肢です。スライスは配列へのポインタよりもはるかに多用途です。コードは非常に簡潔なので、作業が簡単になります。したがって、可能な限りスライスを使用してください。

プログラミング関連の知識について詳しくは、

プログラミング ビデオ
をご覧ください。 !

以上がGo言語のポインタに関する11の知識を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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