# Go篇|内存分配:new和make

这是我参与更文挑战的第11天,活动详情查看: 更文挑战

程序运行时都需要内存。

Go语言中,开发者仅需声明变量,Go语言就会根据变量的类型自动分配响应内存。内存分为两部分:

  • 栈内存,go语言管理,分配和释放
  • 堆内存,开发者需要关注

声明变量

var s string // 零值是 “”
var sp *string // 零值是 nil
复制代码

仅声明变量,没有初始化,则值都默认为零值

变量赋值

// 声明直接初始化
var s string ="hello"
// 声明后再初始化
var s string
 s = "hello"
// 简单声明
s := "hello"

// 指针类型 -->编译时将报错:panic: runtime error: invalid memory address or nil pointer dereference
var sp * string
*sp = "hello" 

复制代码

值类型,没有初始化时直接赋值,没有问题

指针类型,如果没有分配内存,则默认零值是nil,没有指向内存将无法使用。所以以上方式将会报错

指针类型的变量必须要经过声明、内存分配才能赋值,才可以在声明时进行初始化。GO语言在指针类型声明时,不会自动分配内存,所以不能赋值操作。

分配内存可以使用new函数或者make函数

new函数

通过new函数分配内存并返回指向该内存的指针,就可以通过指针对这块内存进行赋值、取值等操作

new函数只用于分配内存,并把内存清零,返回一个指向对应类型的零值的指针。

一般用于需显示返回指针的情况

type person struc{
   name string
   age  int
}

// 工厂函数,通过不同的参数构建不同的*person变量
func New(name string, age int) *person{
  p := new(person)
  p.name = name
  p.age = age
  return &p
}
复制代码

make函数

只用于slice、chan和map这三种内置类型的创建和初始化

m := make(map[string]int,10)
复制代码

make函数就是map类型的工厂函数,可根据传递它的K-V键值对类型,创建不同类型的map,同时可以初始化map的大小。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享