指针

&*

取地址符

&
package main

import "fmt"

func main() {
 a := 1   // 定义一个变量a,并赋值为1
 b := &a   // 通过取地址符取出变量a在内存中的地址
 fmt.Println(b) // 打印取出的地址
}

运行结果:每个人的运行结果不一样,只要打印的是如下格式的内容表示成功。

运行结果

取值符

*
package main

import "fmt"

func main() {
 a := 1
 b := &a
 c := *b
 fmt.Printf("b的类型:%T \n", b)
 fmt.Printf("c的值:%d \n", c)
}
*int*b

运行结果:

运行结果

指针声明

int float32 string*int *float32 *string

语法:

var 指针名 *类型

代码示例:

package main

import "fmt"

func main() {
 var a *int   // 定义一个指针类型
 fmt.Println(a)  // 输出为<nil>
}

上面定义了一个指针a,但是指针a没有分配到变量时,其值就为nil,称之为空指针。

直接给指针赋值:

package main

import "fmt"

func main() {
 var a *int
 *a = 1
 fmt.Println(a)
}

如果如上所示直接运行,代码会产生报错,报错信息如下,报错原因是在Go语言中对于引用类型的变量,在使用的时候不仅要声明,还要为其分配内存空间,否则赋的值就没办法存储。而对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。

运行结果

new

函数签名:

func new(Type) *Type

使用new函数时,传入一个类型,返回一个指向该类型内存地址的指针,使用new得到的指针其对应的值为该类型的默认值。

a := new(int)
b := new(bool)
fmt.Println(*a)       // 默认值为 0
fmt.Println(*b)       // 默认值为 false
var a *int
package main

import "fmt"

func main() {
 a := new(int)
 *a = 1
 fmt.Printf("a的值:%d \n", *a)
 fmt.Printf("a的类型:%T \n", a)
}

运行结果:

运行结果