Go 言語 (Golang) は、静的に型付けされたプログラミング言語です。これは検索エンジン大手 Google の内部プロジェクトとして誕生し、2009 年にデビューし、2012 年にオープンソースとしてリリースされました。 Go言語は時代の変化とともに徐々にプログラミング言語として認知されてきましたが、その特徴の一つとしてポインタの扱いが非常に明確かつ簡潔であることがあげられます。この記事では、Golang ポインタの使い方とポインタ変換について詳しく紹介します。
1. ポインタの基本的な使い方
Golang におけるポインタとは、変数のメモリアドレスを格納する型で、変数ではなく、そのアドレスに対応する変数に直接アクセスできます。自体。記号「&」を使用して変数のアドレスを取得し、記号「*」を使用してポインタが指す変数の値を取得できます。サンプル コードは次のとおりです。
func main() { var a int = 10 var pa *int = &a fmt.Printf("a=%v, pa=%v\n", a, pa) // a=10, pa=0x123456 *pa = 20 fmt.Printf("a=%v, pa=%v\n", a, pa) // a=20, pa=0x123456 }
上記のコードでは、pa
は a
へのポインタであり、&a
で a# を取得できます。 # # アドレス、
*pa は
a が指す値を取得でき、
*pa への変更は
a の値に直接影響します。
int 型を指すポインターを
string ポインターを指す型に変換することはできません。ただし、
unsafe.Pointer を通じてポインターの多用途性を実現できます。
unsafe.Pointer は任意の型へのポインタであり、任意の型のポインタを
unsafe.Pointer 型ポインタに変換できます。サンプル コードは次のとおりです。
func main() { var a int = 10 var pa *int = &a fmt.Printf("a=%v, pa=%v\n", a, pa) // a=10, pa=0x123456 var pb *string = (*string)(unsafe.Pointer(pa)) // 将pa指向的int类型转换为string类型 *pb = "hello" fmt.Printf("a=%v, pb=%v\n", a, pb) // a=1869375336, pb=0x123456 var pc *int = (*int)(unsafe.Pointer(pb)) // 将pb指向的string类型转换为int类型 *pc = 20 fmt.Printf("a=%v, pc=%v\n", a, pc) // a=20, pc=0x123456 }
pa の型を
*int として定義し、それを
&a# として割り当てます。 ##。このとき、pa
は a
のメモリアドレスを指します。次に、pa
を *string
型のポインターに変換し、それを pb
に割り当てます。このとき、pb
は a
のメモリアドレスを指しますが、そのデータ型は string
に変わります。 *pb="hello"
を呼び出した後、対応するメモリアドレスに保存されたデータは文字列「hello」になります。最後に、pb
を *int
型のポインターに変換し、それを pc
に割り当てます。この時点では、pc
は依然として a
のメモリ アドレスを指していますが、そのデータ型は int
に戻り、*pc=20## を呼び出します。 # その後、
a の値も 20 になりました。
ポインター変換に
unsafe.Pointer
unsafe.Pointer はあらゆる種類のポインターを指すことができるため、ポインター変換を実行するときは、データ型の不一致によって引き起こされるメモリ エラーを避けるために特に注意する必要があります。
3. 結論
以上がgolang ポインタ変換を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。