Go 指针

本文最后更新于:10 天前

我们通过变量来存储数据,起始变量的本质是给存储数据的内存地址起一个好的名字,比如我定义一个变量a:=10 这个时候可以直接通过a这个变量来读取内存中的10 这个值,但是在计算机底层a 这隔变量起始对应了一块内存地址

1 指针

指针是引用类型

它也是一个变量,但它是一个特殊的变量,他存储的数据不是一个普通值,而是另一个变量的内存地址

普通变量 var a int = 10 
指针变量 var p *int = &a

1.1 简单代码看一下效果

package main

import "fmt"

func main() {
	var a = 10
	var p = &a
	fmt.Printf("a的值,%v,a的类型: %T,a的地址: %p\n", a, a, &a)
	fmt.Printf("p的值,%v,p的类型: %T,p的地址: %p", p, p, &p)

}
/*
a的值,10,a的类型: int,a的地址: 0xc0000b2008
p的值,0xc0000b2008,p的类型: *int,p的地址: 0xc0000ac018

*/

1.3 通过指针改变值

package main

import "fmt"

func main() {
	var a = 10
	var p = &a
	fmt.Printf("a的值,%v,a的类型: %T,a的地址: %p\n", a, a, &a)
	fmt.Printf("p的值,%v,p的类型: %T,p的地址: %p\n", p, p, &p)

	fmt.Println(p)  //a的内存地址
	fmt.Println(*p) //取出变量p对应的内存地址的值 也就是a内存地址存储的值
	*p = 30
	fmt.Println(a) //打印出30,因为*p 是可以修改值的

}

2 new函数分配内存空间

new是一个内置的函数,他的函数含义如下:

func new(Type) *Type
  • Type 表示类型 new函数只是接受一个参数,这个参数是一个类型
  • *Type 表示类型指针,new函数返回一个指向该类型的内存地址的指针

实际开发中new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值维该类型零值。

var b = new(int)
	fmt.Printf("值:%v,类型:%T,指针变量对应的值: %v", b, b, &b) 
//值:0xc000096040,类型:*int,指针变量对应的值: 0xc00008c020

var c *int
c = new(int)

3 make 函数分配内存

make 也是用于内存分配的,区别于new,它只用于slice,map以及channel的内存创建,而且他返回的类型就是这三个类型的本身,而不是他们的指针类型,因为这三中类型就是引用类型,所以就没有必要返回他们的指针了,make函数的函数名如下:

func make(Type,size ...interType) Type

make 函数是无可取代的,我们在使用的slice和map以及channel的时候,都需要使用make 进行初始化,然后才可以对他们进行操作

var userinfo = make(map[string]string)
userinfo["username"] = "bds"
fmt.Println(userinfo)

var a = make([]int, 4, 4)
a[0] = 1
fmt.Println(a)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!