Go语言学习——指针、new和make
2022-05-01 10:39
2076 查看
#指针
Go语言中不存在指针操作,只需要记住两个符号:
- &:取地址
- *:根据地址取值
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 }
相关文章推荐
- Go基础知识学习(5) 指针,new, make
- 从默认析构函数学习c++,new,delete,内存泄漏,野指针
- C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator
- 深入学习golang(4)—new与make
- 深入学习golang(4)—new与make
- go语言中的new与make
- 指针学习1--new &delete & destructor
- centos学习 明白命令行、make编译、指针
- C++11智能指针之优先使用std::make_unique和std::make_shared而不是直接使用new
- [Golang 学习1]Go语言中函数new与make的使用和区别
- 【学习】C++(1) 指针 new 和delete
- 实战c++中的智能指针unique_ptr系列-- std::unique_ptr的构造(尽量使用C++14中的std::make_unique,而不是new)
- 【基础学习】【C++】chapter 4: Compound Types(3) || 指针、利用new和delete动态分配内存、vector和array模板类
- 实战c++中的智能指针unique_ptr系列-- std::unique_ptr的构造(尽量使用C++14中的std::make_unique,而不是new)
- 深入学习golang(4)—new与make
- Go学习——new()和 make()的区别详解(转载)
- Go语言学习之new与make(The way to go)
- Go语言学习三:Go基础(iota,array,slice,map,make,new)
- 改善C++ 程序的150个建议学习之建议34:用智能指针管理通过new创建的对象
- 智能指针基础std::auto_ptr与new、delete的重载学习笔记