Go by Example 中文版 :指针
Go 支持指针,允许在程序中通过引用传递值或者数据结构。
相关程序示例如下:
package main
import "fmt"
// 我们将通过两个函数:zeroval 和 zeroptr 来比较指针和值类型的不同。zeroval 有一个 int 型参数,所以使用值传递。zeroval 将从调用它的那个函数中得到一个 ival形参的拷贝。
func zeroval(ival int) {
ival = 0
}
// zeroptr 有一和上面不同的 *int 参数,意味着它用了一个 int指针。函数体内的 *iptr 接着解引用 这个指针,从它内存地址得到这个地址对应的当前值。对一个解引用的指针赋值将会改变这个指针引用的真实地址的值。
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("initial:", i)
zeroval(i)
fmt.Println("zeroval:", i)
// 通过 &i 语法来取得 i 的内存地址,例如一个变量i 的指针。
zeroptr(&i)
fmt.Println("zeroptr:", i)
// 指针也是可以被打印的。
fmt.Println("pointer:", &i)
}
zeroval 在 main 函数中不能改变 i 的值, 但是 zeroptr 可以,因为它有这个变量的内存地址的引用。
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100
使用指针交换两个整数的示例程序
go中的指针和C/C++中的指针是类似的,通过值传递是无法交换两个整数的,但是通过指针却可以。
通过值传递交换两个整数
// 通过值传递是无法交换两个整数的
func swapByVal(a int, b int) {
var temp int
temp = a
a = b
b = temp
}
使用指针交换两个整数
// 通过指针可以交换两个整数
func swapByPointer(pA *int, pB *int) {
var pTemp int
pTemp = *pA
*pA = *pB
*pB = pTemp
}
完整的示例程序代码如下:
package main
import "fmt"
// 通过值传递是无法交换两个整数的
func swapByVal(a int, b int) {
var temp int
temp = a
a = b
b = temp
}
// 通过指针可以交换两个整数
func swapByPointer(pA *int, pB *int) {
var pTemp int
pTemp = *pA
*pA = *pB
*pB = pTemp
}
func main() {
var a, b int = 10, 20
fmt.Println("初始化前,a=", b, ",b=", b)
swapByVal(a, b)
fmt.Println("调用swapByVal(a,b)函数后,a=", a, ",b=", b)
swapByPointer(&a, &b)
fmt.Println("调用swapByPointer(&a, &b)函数后,a=", a, ",b=", b)
}