目次
ポインタ操作
Go 言語では、ポインターは変数自体ではなく変数のアドレスを渡すために使用できる非常に重要な型です。
ポインタを定義する
Go 言語では、*
演算子を使用してポインターを定義します。たとえば、整数ポインタを定義するための構文は次のとおりです。
var ptr *int
変数アドレスを取得する
&
変数のアドレスは、次のような演算子を使用して取得できます。
var a int = 10
var ptr *int = &a
この例では、ptr
変数にはa
変数のアドレスが含まれています。
逆参照ポインタ
*
演算子を使用してポインターを逆参照し、ポインターが指す変数にアクセスします。たとえば、次はポインターを使用して変数にアクセスする例です。
var a int = 10
var ptr *int = &a
fmt.Println("a 的值为:", a)
fmt.Println("*ptr 的值为:", *ptr)
この例では、の値である指す変数に*ptr
アクセスします。ptr
a
関数の引数としてのポインター
ポインタを関数のパラメータとして使用すると、関数の呼び出し時に渡される変数の値を変更できます。例えば:
func swap(x *int, y *int) {
var temp int
temp = *x /* 保存 x 地址的值 */
*x = *y /* 将 y 赋值给 x */
*y = temp /* 将 temp 赋值给 y */
}
func main() {
/* 定义局部变量 */
var a int = 100
var b int= 200
fmt.Printf("交换前 a 的值 : %d\n", a )
fmt.Printf("交换前 b 的值 : %d\n", b )
/* 调用 swap() 函数
* &a 指向 a 变量的地址
* &b 指向 b 变量的地址
*/
swap(&a, &b)
fmt.Printf("交换后 a 的值 : %d\n", a )
fmt.Printf("交换后 b 的值 : %d\n", b )
}
この例では、swap()
関数はパラメータとしてポインタを取るため、main()
関数に渡されるa
変数の値を変更できますb
。
nullへのポインタ
Go 言語では、ポインターを null にすることができます。次に例を示します。
var ptr *int = nil
この例では、int 型の変数へのポインター p を作成します。p を nil に初期化します。これは、有効なメモリ アドレスを指さないことを意味します。次に、& 演算子を使用して変数 x のアドレスを取得し、それをポインター p に割り当てます。最後に、 * 演算子を使用して p を逆参照し、それが指すアドレスに格納されている値を取得し、変数 y に格納します。
Go 言語では、ポインタは算術演算を実行できず、整数に直接加算したり、整数から直接減算したりすることもできないことに注意してください。さらに、ポインタが指す値にアクセスする前に、ポインタが nil でないことを確認する必要があります。そうしないと、実行時エラーが発生します。
よく使われるポインタ関数
Go 言語では、ポインタはプログラム内のメモリを操作し、プログラムの効率を向上させるために使用できる非常に重要な概念です。基本的なポインター演算に加えて、ポインターの操作に使用できる一般的に使用されるポインター関数がいくつかあります。
新しい機能
新しい関数は、型へのポインターを作成し、ポインターのアドレスを返すために使用されます。以下に例を示します。
func main() {
var p *int
p = new(int)
*p = 10
fmt.Println(*p)
}
ここでは、new 関数を使用して int 型のポインターが作成され、変数 p に割り当てられます。次に、ポインタ p を介して変数を代入して出力します。
関数を作成する
make 関数は、スライス、マップ、またはチャネル タイプのオブジェクトを作成するために使用され、オブジェクトへの参照を返します。以下に例を示します。
func main() {
var s []int
s = make([]int, 5)
s[0] = 1
fmt.Println(s)
}
ここでは、make 関数を使用して長さ 5 の整数スライスを作成し、それを変数 s に割り当てます。次に、添え字演算を使用して、スライス内の要素を割り当てて出力します。
追加関数
append 関数は、要素をスライスに追加するために使用されます。1 つ以上の引数を受け取ることができ、各引数はスライスに追加する要素です。以下に例を示します。
func main() {
var s []int
s = append(s, 1)
s = append(s, 2, 3, 4)
fmt.Println(s)
}
ここでは、最初に空の整数スライスが作成され、append 関数を使用して 3 つの要素が追加されます。最後に要素追加後のスライスを出力します。
コピー機能
コピー機能は、あるスライスの内容を別のスライスにコピーするために使用されます。これには 2 つのパラメータが必要です。最初のパラメータはコピー先のスライス、2 番目のパラメータはコピー先のスライスです。以下に例を示します。
func main() {
s1 := []int{1, 2, 3}
s2 := []int{4, 5, 6}
copy(s1, s2)
fmt.Println(s1)
}
ここでは、2 つの整数スライス s1 と s2 が作成され、s2 の内容が s1 にコピーされます。最後に、コピーされた s1 が出力されます。
上記の一般的に使用されるポインター関数に加えて、アドレス記号 & の取得、ポインター逆参照記号 *、ポインター演算子 + および - など、その他の一般的に使用されるポインター操作もあります。ポインタを使用する場合は、ポインタが空かどうか、およびポインタが有効なメモリ アドレスを指しているかどうかに注意する必要があります。同時に、ワイルド ポインターなどの問題を回避するために、ポインターのライフ サイクルにも注意を払う必要があります。