大家好,今天将梳理出的 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 函数默认有三个参数

func make(t Type, size ...IntegerType) Type // 函数原型

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

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

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

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

使用

第一种用法: slice 切片

num1 := make([]int, 2) // 指定长度为2的 slice
num2 := make([]int, 2, 4) // 指定长度为2, 指定预留的空间长度为4

第二种用法: map 初始化

make(map[string]string)

第三种用法: chan 声明

ch := make(chan int) // 声明初始化chan为int类型

new

介绍

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

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

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

这里 Type 是指类型,不是值

func new(Type) *Type // 函数原型

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

使用

使用指针对象赋值

num := new(int) // 自动内存分配
*num = 100 // 赋值

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

下面是手动分配

var p *int
*p = new(int)
*p = 100

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

num1 := new(int)
num2 := new(int)
fmt.Println(num1 == num2) // "false"

我们目前只需使用new()函数,无需担心其内存的生命周期或怎样将其删除,因为Go语言的内存管理系统会帮我们打理一切。

new实现原理,将放到后面的进阶阶段来为大家分享。

append

介绍

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

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

func append(slice []Type, elems ...Type) []Type // 函数原型

slice: 切片的类型

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

使用

第一种方式

slice1 := append([]int{1,2,3}, 4) // 单个元素传入
slice2 := append([]int{1,2,3}, 4, 5, 6) // 单个元素传入

第二种方式

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

slice := append([]int{1,2,3}, []int{4,5,6}...) // 接收两个slice需要填写...

第三种方式

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

slice := append([]byte("帽儿山的枪手 "), "分享技术文章"...)

append 返回值必须要有接收变量,不然编译器会报错。

因为Go函数传递默认是值拷贝,将slice变量传入append函数相当于传了原slice变量的一个副本,注意不是拷贝底层数组,因为slice变量并不是数组,它仅仅是存储了底层数组的一些信息。

copy

介绍

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

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

func copy(dst, src []Type) int // 函数原型

复制内置函数将元素从源切片复制到目标片。(作为特例,它还将从字符串中复制字节。)

源和目标可能重叠。副本返回复制的元素数,即len(src)和len(dst)。

注意

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

使用

长度相等时

s := []int{1, 2, 3}
copy(s, []int{4,5,6})
fmt.Println(s) // 输出 [4 5 6]

长度不相等时

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、字符串等数据类型的长度。

func len(v Type) int // 函数原型

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

各类型返回

  • 数组或数组指针:返回元素个数
  • map和slice:元素个数
  • channel:通道中未读的元素个数
  • 字符串:字节数,并非字符串的字符数
  • 当V的值为nil值,len返回0

使用

res := len([]int{1, 2, 3})
fmt.Println(res) // 3

cap

介绍

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

func cap(v Type) int // 函数原型

使用

slice := make([]int, 5, 10)  // 第三个参数, 预留内存空间 10
fmt.Println(cap(slice)) // 10

print、println

介绍

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

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

func print(args ...Type) // 函数原型

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

func println(args ...Type) // 函数原型

注意点

  • 不能打印数组、结构体(复合类型)

  • 对于组合类型(除了基本类型都是)的值会打印底层引用值地址

使用

print("print", "帽儿山的枪手\n")
println("println", "帽儿山的枪手")

输出

print帽儿山的枪手
println 帽儿山的枪手

技术文章持续更新,请大家多多关注呀~~

搜索微信公众号【 帽儿山的枪手 】,关注我

Golang 基础之内建函数使用 (一)的更多相关文章

  1. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  2. GoLang基础数据类型--->字典(map)详解

    GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...

  3. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  4. golang基础知识之encoding/json package

    golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...

  5. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  6. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  7. GoLang基础数据类型--->字符串处理大全

    GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:   高级运维工程师之路               59843264 ...

  8. 如何使用gitlab自建golang基础库

    这里以go mod方式建立golang基础库 一.gitlab创建项目golib 地址为gitlab.xxx.com/base/golib 示例如下 go mod初始化命令 go mod init g ...

  9. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  10. Golang 基础之基础语法梳理 (二)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...

随机推荐

  1. TVM: 编译流程

    深度学习编译器介绍 每一种硬件对应一门特定的编程语言,再通过特定的编译器去进行编译产生机器码,那随着硬件和语言的增多,编译器的维护难度会有很大困难.现代编译器已经解决了这个问题. 为了解决这个问题,科 ...

  2. odoo16里面修改tree视图样式

    一.在static文件夹下新建一个css文件夹并将*.css文件写入 /*该文件用来定义视图中的一些格式,需要用到的地方直接在xml文件中进行引用*/ /*语法说明*/ /* table th:nth ...

  3. CentOS 7.* 安装最新版nginx1.28*

    一.下载nginx https://nginx.org/en/download.html 选择稳定版本 nginx-1.28.0 如果使用虚拟机,可以先用windows系统下载后,上传到虚机,此步骤省 ...

  4. Fiddler破解钉钉禁止点赞 钉钉点赞一下转换1*10^7+个赞

    破解钉钉禁止点赞 点一下1*10^7+个赞 说明:本文未经授权禁止转载 紧急upd 3.14号之后无法点超过一个赞,所以修改数据包时(unlock.html)的数字无法设置那么大,只能设置为1.当然, ...

  5. ElasticSearch高可用部署

    简单说明 我们在部署ElasticSearch高可用集群时,要规划好集群的规模,每个节点的职责,规划好后续的水平扩展方案,再进行部署. 核心概念 Cluster:集群,由一个或多个 Elasticse ...

  6. kubernetes网络组件calico详解

    一.Calico介绍 Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack.Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Inte ...

  7. Nginx采坑日记(后台响应ResponseEntity时,Nginx将部分数据过滤)

    执行流程: 问题描述: 后台响应ResponseEntity时,Nginx将部分数据过滤了,导致Vue提示如下图,但是实际上已经代理成功并返回数据了. 原因: 官网说明:http://nginx.or ...

  8. 大模型VS小模型:论国产数据库运维AI Agent的正确打开方式

    作者:孙鹏,大衍(北京)科技有限公司研发工程师 首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 "老纪的技术唠嗑局",会持续更新和 #数据库.#AI.#技术架构 相 ...

  9. Jit 报错TracingCheckError:ERROR: Graphs differed across invocations!

    问题描述 使用Tinynn将Pytorch转化为tflite时报错: 发生异常: TracingCheckError (note: full exception trace is shown but ...

  10. RL Swarm:去中心化强化学习协作训练平台

    项目概述 RL Swarm 是由Gensyn团队维护的去中心化强化学习协作训练平台.该系统允许用户加入"蜂群"与其他参与者共同训练模型,利用集体智能提升训练效率.核心特点包括: 真 ...