首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang 基础之内建函数使用 (一)

Golang 基础之内建函数使用 (一)

原创
作者头像
帽儿山的枪手
发布于 2022-05-29 13:44:46
发布于 2022-05-29 13:44:46
29800
代码可运行
举报
运行总次数:0
代码可运行

大家好,今天将梳理出的 Go语言内建函数内容,分享给大家。 请多多指教,谢谢。

本次《Go语言内建函数使用》共分为两个章节,本文为第一章节

  • Golang 基础之内建函数使用 (一)
  • Golang 基础之内建函数使用 (二)

本节知识点

内建函数主要参考 go源码 go/src/builtin/builtin.go 中定义,以下内容将介绍每个内建函数的使用。

  • make
  • new
  • append
  • copy
  • len
  • cap
  • print
  • println

make

介绍

make内建函数,用于引用类型(map、slice 和channel)的内存分配,并且返回一个有初始值(非零)的T类型。

slice、map和channel 这三个类型在使用前必须被初始化。 slice 初始化默认是nil,map、channel类型 make默认初始化了内部的数据结构,填充适当的值(初始值)。

make 函数默认有三个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func make(t Type, size ...IntegerType) Type // 函数原型

Type: 数据类型,必要参数,只能是 slicemapchannel 这三种数据类型。

size: 数据类型实际占用的内存空间长度,mapchannel 是可选参数,slice 是必要参数。

...: 为数据类型提前预留的内存空间长度,可选参数。所谓的提前预留是当前为数据类型申请内存空间的时候,提前申请好额外的内存空间,这样可以避免二次分配内存带来的开销,大大提高程序的性能。

这里IntegerType 类型是 go 源码builtin.go中定义的type IntegerType int 别名

使用

第一种用法: slice 切片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num1 := make([]int, 2) // 指定长度为2的 slice
num2 := make([]int, 2, 4) // 指定长度为2, 指定预留的空间长度为4

第二种用法: map 初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make(map[string]string)

第三种用法: chan 声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ch := make(chan int) // 声明初始化chan为int类型

new

介绍

new内建函数,用于各种类型的内存分配。

new内建函数用法 new(T) 分配了零值填充的T类型的内存空间,并且返回其地址,即 *T 类型的值。

用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。

这里 Type 是指类型,不是值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func new(Type) *Type // 函数原型

新的内置函数分配内存。第一个参数是类型,不是值,返回的值是指向新分配的零的指针这种类型的值。

使用

使用指针对象赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num := new(int) // 自动内存分配
*num = 100 // 赋值

go语言中只声明的指针变量不能直接赋值,需要手动分配空间才能使用

下面是手动分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var p *int
*p = new(int)
*p = 100

每次调用new函数都是返回一个新的变量的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num1 := new(int)
num2 := new(int)
fmt.Println(num1 == num2)   // "false"

我们目前只需使用new()函数,无需担心其内存的生命周期或怎样将其删除,因为Go语言的内存管理系统会帮我们打理一切。 new实现原理,将放到后面的进阶阶段来为大家分享。

append

介绍

append内建函数,主要用于切片(slice) 追加元素。

如果该切片存储空间(cap)足够,就直接追加,长度(len)变长;如果空间不足,就会重新开辟内存,并将之前的元素和新的元素一同拷贝进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func append(slice []Type, elems ...Type) []Type // 函数原型

slice: 切片的类型

elems: 可以传入多个参数元素

使用

第一种方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slice1 := append([]int{1,2,3}, 4) // 单个元素传入
slice2 := append([]int{1,2,3}, 4, 5, 6) // 单个元素传入

第二种方式

将内容追加第一个[]int数组中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slice := append([]int{1,2,3}, []int{4,5,6}...) // 接收两个slice需要填写...  

第三种方式

使用[]byte类型,将字符串类型追加 []byte数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slice := append([]byte("帽儿山的枪手 "), "分享技术文章"...)

append 返回值必须要有接收变量,不然编译器会报错。 因为Go函数传递默认是值拷贝,将slice变量传入append函数相当于传了原slice变量的一个副本,注意不是拷贝底层数组,因为slice变量并不是数组,它仅仅是存储了底层数组的一些信息。

copy

介绍

copy内建函数,只能用于数组切片内容赋值。

返回结果为一个 int 型值,表示 copy 的长度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func copy(dst, src []Type) int // 函数原型

复制内置函数将元素从源切片复制到目标片。(作为特例,它还将从字符串中复制字节。) 源和目标可能重叠。副本返回复制的元素数,即len(src)和len(dst)。

注意

  • 如果 dst 长度小于 src 的长度,则 copy 部分
  • 如果大于,则全部拷贝过来,只是没占满 dst 的位子而已
  • 相等时刚好不多不少 copy 过来
  • 如果切片元素的类型是引用类型,那么 copy 的也将是个引用
使用

长度相等时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s := []int{1, 2, 3}
copy(s, []int{4,5,6})
fmt.Println(s) // 输出 [4 5 6]

长度不相等时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s := []int{1, 2, 3, 4}
copy(s, []int{7, 8, 9, 10, 11})
fmt.Println(s) // 输出 [7 8 9 10]

len

介绍

len内置函数,用于计算数组(包括数组指针)、切片(slice)、map、channel、字符串等数据类型的长度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func len(v Type) int // 函数原型

注意:结构体(struct)、整型布尔等不能作为参数传给len函数。

各类型返回

  • 数组或数组指针:返回元素个数
  • map和slice:元素个数
  • channel:通道中未读的元素个数
  • 字符串:字节数,并非字符串的字符数
  • 当V的值为nil值,len返回0
使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
res := len([]int{1, 2, 3})
fmt.Println(res) // 3

cap

介绍

cap内建函数,返回指定类型的容量,根据不同类型,返回分配的空间大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func cap(v Type) int // 函数原型
使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slice := make([]int, 5, 10)  // 第三个参数, 预留内存空间 10
fmt.Println(cap(slice)) // 10

print、println

介绍

print 内置函数将其参数格式化为实现特定的方法,并将结果写入标准错误。

主要用于打印和调试;它不一定会留在实际生产代码中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func print(args ...Type) // 函数原型

println 内置函数相比 print 增加了默认换行,打印的每一项之间都会有空行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func println(args ...Type) // 函数原型

注意点

  • 不能打印数组、结构体(复合类型)
  • 对于组合类型(除了基本类型都是)的值会打印底层引用值地址
使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("print", "帽儿山的枪手\n")
println("println", "帽儿山的枪手")

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print帽儿山的枪手
println 帽儿山的枪手

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang 基础之基础语法梳理 (一)
第三部分 main函数定义,在go语言中,代码如果需要跑起来,代码必须要有main函数作为入口。
帽儿山的枪手
2022/03/18
3970
Golang 基础之基础语法梳理 (一)
Golang 基础之内建函数使用 (二)
close内建函数,其功能是关闭一个通道,该通道必须是双向或仅发送。它只能由发送者执行,而不能由发送者执行接收器,并具有在最后一次发送值被接收。在从已关闭的通道c,任何来自c的接收都将在不阻塞的情况下成功,返回通道元素的值为零。
帽儿山的枪手
2022/06/05
3600
Golang 基础之内建函数使用 (二)
Go 语言 15 个内置函数详解
Go 语言为了方便我们开发,提供了 15 个内置函数,比如 len、cap、make 和 new 等。
frank.
2023/09/08
7560
Go 语言 15 个内置函数详解
Golang语言情怀-第44期 Go 语言标准库翻译 builtin
builtin 包为Go的预声明标识符提供了文档。此处列出的条目其实并不在builtin 包中,对它们的描述只是为了让 godoc 给该语言的特殊标识符提供文档。
李海彬
2021/03/09
6560
Golang高效实践之array、slice、map实践
Golang的slice类型为连续同类型数据提供了一个方便并且高效的实现方式。slice的实现是基于array,slice和map一样是类似于指针语义,传递slice和map并不涉及底层数据结构的拷贝,相当于传递底层数据结构的指针。
用户2937493
2019/08/29
7630
Golang高效实践之array、slice、map实践
Golang语言--细节汇总
slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动 计算长度,而声明slice时,方括号内没有任何字符。 对于slice有几个有用的内置函数: l len 获取slice的长度 l cap 获取slice的最大容量 l append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice l copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数 make用于内建类型(map、slice 和chann
李海彬
2018/03/21
8030
Go语言基础4 - 数据(基本数据结构)
new 函数格式为: new(T) 特点:它返回一个指针, 该指针指向新分配的,类型为 T 的零值
张云飞Vir
2020/03/16
8430
golang中make 和 new 的区别
GeekLiHua
2025/01/21
1230
golang中make 和 new 的区别
Go语法指南
出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,它分为三节。第一节覆盖了基本语法及数据结构,第二节讨论了方法与接口, 第三节则简单介绍了 Go 的并发原语。每节末尾都有几个练习,你可以对自己的所学进行实践。 你可以 在线学习 或 安装到本地。 Go基础语法,方便查阅 包、变量和函数 学习 Go 程序的基本组件 1.包 每个 Go 程序都是由包组成的。 程序运行的入口是包 main。 这个程序使用并导入了包 "fmt" 和 "math/rand
spilledyear
2022/05/13
1.2K0
Go语法指南
【从零开始学习Go语言】七.Go标识符之内置函数常量总结
golang的内置函数共有十五个,不需要使用import引入便可以直接使用的函数。
一只特立独行的兔先生
2020/04/01
4K0
【从零开始学习Go语言】七.Go标识符之内置函数常量总结
Golang-optimization「1」: 数组和切片
本系列的第一个部分,本文就来谈谈日常开发中几乎是最常用的,且在 Golang 中又有一定特殊性的数组和切片中有哪些值得注意的优化点
Kevinello
2022/10/16
3680
Golang-optimization「1」: 数组和切片
Golang 基础语法-高级数据类型
本文主要介绍 golang 内置数据类型的 array, slice, map。这几种数据类型在日常使用中是非常常见的。
luxixing
2019/05/28
4670
Go语言入门基础
指针 Go 具有指针。 指针保存了变量的内存地址。 类型 *T 是指向类型 T的值的指针。其零值是 nil 。 var p *int 复制代码 & 符号会生成一个指向其作用对象的指针。 i := 42 p = &i 复制代码 *符号表示指针指向的底层的值。 fmt.Println(*p) // 通过指针 p 读取 i *p = 21         // 通过指针 p 设置 i 这也就是通常所说的“间接引用”或“非直接引用”。 与 C 不同,Go 没有指针运算。 package main import
李海彬
2018/03/27
6810
【从零开始学习Go语言】七.Go标识符之内置函数常量总结
golang的内置函数共有十五个,不需要使用import引入便可以直接使用的函数。
一只特立独行的兔先生
2020/03/26
3.9K0
【从零开始学习Go语言】七.Go标识符之内置函数常量总结
《Go小技巧&易错点100例》第二十篇
在Go语言中,append(), copy(), len(), cap() 函数是处理切片(slice)时非常常用的内置函数,但它们并不直接涉及 delete(),因为 delete() 是用于处理映射(map)的内置函数,用于删除映射中的键值对。下面是每个函数的作用说明:
闫同学
2024/08/13
1790
[GO专栏-5]GO中5 分组声明与array, slice, map
在 Go 语言中,同时声明多个常量、变量,或者导入多个包时,可采用分组的方式进行声明。
苏州程序大白
2022/04/13
7850
[GO专栏-5]GO中5 分组声明与array, slice, map
Golang高效实践之泛谈篇
我博客之前的Golang高效实践系列博客中已经系统的介绍了Golang的一些高效实践建议,例如:《Golang高效实践之interface、reflection、json实践》、《Golang 高效实践之defer、panic、recover实践》、《Golang 高效实践之并发实践context篇》、《Golang 高效实践之并发实践channel篇》,本文将介绍一些零散的Golang高效实践建议,虽然琐碎但是比较重要。
用户2937493
2019/08/29
4920
Golang-绕不开的数组和切片总结
Go语言中slice和数组是非常像的两种数据结构,但是切片(slice)比数组更好用,Go更推荐slice。当然在面试中也是出现频率非常高的,总结一些数组和slice常见的问题。
小许code
2023/02/06
6470
Golang-绕不开的数组和切片总结
Golang make vs new
在 Go 语言中,make 和 new 是两个用于创建对象的内建函数,但它们有着不同的用途和适用范围。
恋喵大鲤鱼
2023/12/24
3130
​Golang切片(Slice)
举个例子,现在有一个数组a := [8]int{0, 1, 2, 3, 4, 5, 6, 7},切片s1 := a[:5],相应示意图如下。
PayneWu
2020/12/18
8830
​Golang切片(Slice)
相关推荐
Golang 基础之基础语法梳理 (一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验