ポインタは、優れたコードを書く上で最も重要な部分の 1 つです。この記事では、ポインターとは何か、そして Go でのポインターの使用方法について説明します。
ポインタは、アドレスを格納する 変数 です。を指します (数値を格納する単なる変数であることを強調します)。 [関連する推奨事項: Go ビデオ チュートリアル ]
特定の型のポインターは、その型のみを指すことができます (ポインターが指すデータ型は不変です)。
ポインターの構文は非常に単純です。以下は、Go でのポインター宣言の構文です。
var ptr *type var ptrint *int // 指向 int 的指针
ポインタのゼロ値は nil です。
型ポインターは、&
:
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 }
# 演算子を使用してポインター値操作を実行する例です:
package main import ( "fmt" ) func main() { var q int = 42 var p *int p = &q fmt.Println(p) // 0x40e020 fmt.Println(*p) // 42 }
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) }
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. 関数パラメータとしてのポインタ のパラメータとして使用できます。値を直接使用する場合に比べて、いくつかの利点があります。ポインタを引数として使用することは、 大きなオブジェクトを関数に渡す非常に効率的な方法です。したがって、これを使用すると、大幅な最適化が行われます。 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
でない限り、値は "
" になります。そのため、値を変更したい場合は常に、次のポインタを使用する必要があります。値を関数パラメータとして指定し、必要に応じて変更します。 8. 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 }
package main import ( "fmt" ) func main() { f := func() { fmt.Println("a function") } pf := f pf() // 一个函数 }
プログラミング ビデオ
をご覧ください。 !
以上がGo言語のポインタに関する11の知識を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。