Go语言学习——指针、new和make

指针

Go语言中不存在指针操作,只需要记住两个符号:

  1. &:取地址
  2. *:根据地址取值

vscode 打开多个标签页

settings.json中输入"workbench.editor.showTabs": true

指针地址和指针类型

取变量指针的语法:

ptr := &v    // v的类型为T

其中:

  • v:代表被取地址的变量,类型为T
  • ptr:用于接收地址的变量,ptr的类型就为T,称做T的指针类型。代表指针。

指针取值

取地址操作符&和取值操作符是一对互补操作符,&取出地址,根据地址取出地址指向的值

变量、指针地址、指针变量、取地址、取值的关系:

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

new和make

  • 引用类型的变量 声明 分配内存空间
  • 值类型 声明不需要分配内存空间 在声明的时候已经默认分配好了内存空间

new

new是一个内置的函数,它的函数签名如下:

func new(Type) *Type

其中,

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

make

make只用于slice、map以及channel的内存创建

它返回的类型就是这三个类型本身,而不是他们的指针类型

因为这三种类型就是引用类型,所以就没有必要返回他们的指针了

make函数:

func make(t Type, size ...IntegerType) Type

new与make的区别

1. 二者都是用来做内存分配的
2. make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身
3. 而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针
4. make和new都是用来申请内存的
5. new很少用,一般用来给基本数据类型申请内存,string、int返回的是对应类型的指针(string、int)
6. make是用来给slice、map、chan申请内存的,make函数返回的是对应的这三个类型本身

    package main
    
    import "fmt"
    
    // vscode 不支持go module
    // 指针 pointer
    
    func main(){
    	//  1. &: 取地址
    	n := 18
    	fmt.Println(&n)
    	p := &n
    	fmt.Println(p)
    	fmt.Printf("%T\n", p) // *int: int类型的指针
    	//  2. *: 根据地址取值
    	m := *p
    	fmt.Println(m) // 18
    	fmt.Printf("%T\n", m) // int
    
    	// var a1 *int // nil pointer
    	// fmt.Println(a1)
    	// new函数申请一个内存地址
    	var a2 = new(int)
    	fmt.Println(a2) // 0xc0000120d8
    	fmt.Println(*a2) // 0
    	*a2 = 100
    	fmt.Println(*a2) // a1: panic: runtime error: invalid memory address or nil pointer dereference
    	
    }
posted @ 2022-05-01 10:39  寻月隐君  阅读(218)  评论(0编辑  收藏  举报