go 指针
基本概念
指针类型:Go 中的指针由 * 符号表示。例如,*int 表示一个指向整数的指针。
获取地址:使用 & 符号可以获取变量的地址,例如 &x 表示变量 x 的地址。
解引用:通过 * 符号可以获取指针指向的值,例如 *ptr 可以获取 ptr 指向的值。
零值指针:指针的零值为 nil,在使用指针之前应确保它不为 nil。
指针与性能:虽然使用指针可以提高性能,但过度使用指针可能会导致代码难以理解和维护。
Go语言中使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等。
ptr := &v // v的类型为T
- v:代表被取地址的变量,类型为`T`
- ptr:用于接收地址的变量,ptr的类型就为`T`,称做T的指针类型。*代表指针。
func main() {
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078
fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int
fmt.Println(&b) // 0xc00000e018
}
指针取值
在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值,代码如下。
func main() {
//指针取值
a := 10
b := &a // 取变量a的地址,将指针保存到b中
fmt.Printf("type of b:%T\n", b)
c := *b // 指针取值(根据指针去内存取值)
fmt.Printf("type of c:%T\n", c)
fmt.Printf("value of c:%v\n", c)
}
type of b:*int
type of c:int
value of c:10
new和make
func new(Type) *Type
func make(Type, size int) Type
new函数用于分配内存,返回指向新分配的Type类型的指针。
make函数用于根据指定的Type类型和大小分配内存,并返回Type类型的值。
func main() {
a := new(int)
b := new(bool)
fmt.Printf("%T\n", a) // *int
fmt.Printf("%T\n", b) // *bool
fmt.Println(*a) // 0
fmt.Println(*b) // false
}
func main() {
var a *int// 声明一个指针
a = new(int) // 指针初始化
*a = 10
fmt.Println(*a)
}
make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,
因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
func main() {
var b map[string]int //``声明一个map
b = make(map[string]int, 10) // 初始化map 并设置初始容量为10
b["one"] = 1
b["two"] = 2
b["three"] = 3
fmt.Println(b)
}
new与make的区别
- 二者都是用来做内存分配的。
- make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
- 而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针