golang では変数の保存方法が 2 つあり、値型をスタックに保存する方法と、参照型をヒープに保存する方法があります。アドレスを値に変換する必要がある場合、それが値型であるか参照型であるかに注意する必要があります。
値の型の場合、「*address」演算子を使用してアドレスを値に変換できます。例:
a := 10 p := &a // 取变量 a 的地址 b := *p // *p 表示取出 a 的值 fmt.Println(b) // 输出:10
このとき、変数 b の型は int で、 *p は p が指す変数の値を取り出すことを意味するため、その値は変数 a の値と等しくなります。
参照型の場合、アドレスは「*address」演算子を使用して値に変換することもできます。例:
var s []int // 定义一个切片 s s = append(s, 1, 2) // 为 s 添加元素 p := &s // 取切片 s 的地址 v := *p // *p 表示取出 s 的值,即切片本身 fmt.Println(v) // 输出:[1 2]
このとき、変数 v の型は []int です。 *p は p が指す変数の値、つまりスライス s 自体を取り出すことを意味するため、その値は変数 s の値と等しくなります。場合によっては、参照型の値をコピーする必要があり、「値のコピー」メソッドを使用する必要があります。
s1 := []int{1, 2} s2 := make([]int, len(s1)) copy(s2, s1) // 将 s1 拷贝到 s2 fmt.Println(s2) // 输出:[1 2] p1 := &s1 // 取切片 s1 的地址 p2 := &s2 // 取切片 s2 的地址 fmt.Println(*p1 == *p2) // 输出:false,因为 s1 和 s2 的地址不同
上記のコードでは、s1 の値はコピーを通じて s2 にコピーされます。 s2 は s1 とは異なるアドレスを持つ新しいスライスです。したがって、p1とp2の値も異なります。
golang では、ポインターはポインター変数の算術演算 (p、p) をサポートしていないことに注意してください。このような演算は間違っています。ポインタを加算および減算するときは、変数を使用してアドレスを格納する必要があります。たとえば:
a := []int{1, 2, 3} p := &a[0] // 取数组 a 的第一个元素的地址 p = p + 2 // 将 p 指向数组 a 的第三个元素 fmt.Println(*p) // 输出:3
このとき、p の値は a[2] のアドレスです。これは、3 番目の要素のアドレスが次のとおりであるためです。最初の要素のアドレスに 2 つの要素のサイズを加えたものに等しい。
golang では、ポインターは強力なツールですが、ポインターによって引き起こされる問題を避けるために注意して使用する必要があります。ポインターを使用する場合は、次の点に従う必要があります。
つまり、ポインターはプログラムの効率を向上させ、特殊な問題に対処するために使用される高度なツールであり、開発者はポインターを深く理解し、応用する必要があります。
以上がgolangアドレス変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。