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


    大家好,今天将梳理出的 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 帽儿山的枪手
    

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

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

  • 相关阅读:
    “朋友圈”又添好友,DataPipeline与统信服务器操作系统完成产品互认证
    DataPipeline与飞腾完成产品兼容性互认证,携手共建自主IT底层生态
    「山东城商行联盟」数据库准实时数据采集系统上线,DataPipeline助力城市商业银行加快数字化转型
    DataPipeline 实时数据融合产品入驻青云云市场,催化企业数据价值释放
    2020年净利暴涨1288%,遨森电商携手DataPipeline构建实时数据融合体系跑出加速度!
    宏昆酒店集团携手DataPipeline打造实时数据融合平台,酒店业精益管理的新秘诀
    销售易携手DataPipeline,推动“实时感知主动决策客户成功”的变革!
    DataPipeline助力悠星网络出海,以实时数据管理护航爆款游戏
    FIGR/IR业务流程
    ABAP调用堆栈
  • 原文地址:https://www.cnblogs.com/changha0/p/16325004.html
Copyright © 2020-2023  润新知