开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: Go 内置函数 ( buildin ) 基本内容】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9622
Go 内置函数 ( buildin ) 基本内容
基本内容
一、 len: 用来求长度
二、 new: 用来分配内存
三、 make: 用来分配内存
说明
Golang 设计者为了编程方便,提供了一些函数。这些函数可以直接使用,称它为 Go 的内置函数。在 Go 语言标准库文档中也就是 builtin 所属的那一部分,builtin 中函数很多。在 Go 语言标准库文档中,builtin 中有很多函数, new 内建函数 new 分配内存,其第一个实参为类型,而非值,其返回值指向该类型的新分配的零值的指针。内置函数也叫内建函数,常用的函数一个是 len,new 和 make。
文档: https://studygolang.com/pkgdoc -> builtin
一、 len: 用来求长度
比如求 string、array、slice、map、channel 的长度;或者是数组的大小。
二、new: 用来分配内存,主要用来分配值类型,
比如 int、float32,struct... 返回的是指针
1、之前讲的是分配整型,float 和字符串是直接赋值的,可以直接分配指针达到同样的效果。内嵌函数 new 分配内存。其第一个实参为类型,而非值。其返回值为指向该类型的新分配的零值的指针。
2、举例说明 new 的使用:
package main
import (
"fmt"
)
func main() {
num1 ;= 10a
fmt.Printf("num1的类型T , num1的值=%v , num1的地址%v\n", num1,num1,&num1)
num2 := new(int) // *int
//num2 的类型 %T =>*int
// num2 的值=地址 (系统分配的)
// num2 的地址 %v= 地址 (系统分配)
fmt.Printf("num2的类型%T , num2的值=%v, num2的地址%v\n",num2,num2,&num2)
}
3、输出结果:
num1 的类型 Int,num1 的值 100,num1 的地址 0xc04204c080
num2 的类型 *Int,num2 的值 0xc0420100e0,num2 的地址 0xc042004030
上面代码对应的内存分析图:
4、代码分析:
(1) 引入 fmt,写一个主函数。num1:=100,这种用法是最常见的用法,把一个 100 赋给 num1,再输出它的类型和地址 fmt.Printf("num1 的类型 T , num1 的值=%v , num1 的地址 %v\n", num1,num1,&num1),这种最常规的赋值方式可以拿到类型、值还有地址,如果画一个内存图在上方显示。在内存图中有个 num1,它指向了一个空间,空间里放了 100,num1 的地址就是指向这个空间的地址,也就是说如果这样分配一个 int 类型,在内存中就是上图这样分配的。
(2) 用 num2:=new(int) 这种方式分配,num2 的类型 %T =>*int 是一个指针类型, num2 的值=地址 (系统分配的), num2 的地址 %v= 地址 (系统分配)。首先有一个 num2 也会指向一个空间,但这个空间里的值是一个地址,本身空间里就有一个地址,这个地址就是 0xc042004030,也就是 num2 也空间关联的,这个地址才是真正指向值,这个值默认是 0。num2 其实是个指针类型,它的值是一个地址,但是这个地址指向的是一个空间,这个空间默认为 0,在没有赋值的时候默认为 0。结果输出 num2 这个指针,指向的值 =0,说明值是一个 0xc0420100e0。 new 首先分配了一个空间,把地址给了另一个空间,再把 0xc0420100e0 这个地址给 num2 。如果想通过 num2 改变值,*num2=100 ,通过 num2 找到了指向的值,并且改成了 100,再去运行的时候,num2 的指向的值就是 100,但是其它类型、地址没有变化。
(3) 运行后指向的值变成 100,但是地址发生了变化,因为每次执行需要实际的空间来分配,这个地址是有可能变化的,每次执行时内存空间会发生变化,不会固定不变。num2 本身地址的值还有本身空间的地址是无法分配的,是由系统分配的。 new 有两个作用,一是分配一个空间,装了一个数值,二是再分配一个空间把地址放进去,再让 num 指向这个空间。
三、 make: 用来分配内存,主要用来分配引用类型,
比如 channel、map、slice。
make 的用途非常多,make 也用来分配内存,分配引用类型的内存,但 channle、mao、slice 这几个类型还没有讲解。