【Go】常用的内建函数

  • Post author:
  • Post category:其他




【len】内建函数len返回 v 的长度

func len(v Type) int

内建函数len返回 v 的长度,这取决于具体类型:
	数组:v中元素的数量
	数组指针:*v中元素的数量(v为nilpanic)
	切片、映射:v中元素的数量;若v为nillen(v)即为零
	字符串:v中字节的数量
	通道:通道缓存中队列(未读取)元素的数量;若v为 nillen(v)即为零



【new】内建函数new分配内存

func new(Type) *Type

其第一个实参为类型,而非值。
其返回值为指向该类型的新分配的零值的指针。

案例演示:

package main

import "fmt"

func main() {
	var ptr = new(int)
	fmt.Printf("变量ptr的类型:%T\n", ptr)
	fmt.Printf("变量ptr的值:%v\n", ptr)
	fmt.Printf("变量ptr的值(这个值是一个地址)所指向内存的值:%v\n", *ptr)
	fmt.Printf("变量ptr的地址:%v\n", &ptr)
}

/*结果:
变量ptr的类型:*int
变量ptr的值:0xc00000e098
变量ptr的值(这个值是一个地址)所指向内存的值:0
变量ptr的地址:0xc000006028
*/

上述案例的内存示意图:



【make】内建函数make分配并初始化一个类型为切片、映射、或通道的对象

func make(Type, size IntegerType) Type

其第一个实参为类型,而非值。
make的返回类型与其参数相同,而非指向它的指针。
其具体结果取决于具体的类型:
	切片:size指定了其长度。该切片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量;它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
	映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个小的起始大小。
	通道:通道的缓存根据指定的缓存容量初始化。若 size为零或被省略,该信道即为无缓存的。



【recover】内建函数recover允许程序管理恐慌过程中的Go程

func recover() interface{}defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。
若recoverdefer的函数之外被调用,它将不会停止恐慌过程序列。
在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil

案例演示:

package main

import "fmt"

func test() {
	// defer 中的表达式必须为函数调用
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("捕获错误=>", err)
		} else {
			fmt.Println("没有错误=>", err)
		}
	}()
	var a, b = 10, 0
	var res = a / b
	fmt.Println("a / b =", res)
}

func main() {
	test()
	fmt.Println("程序继续执行")
}

/*结果:
捕获错误=> runtime error: integer divide by zero
程序继续执行
*/



【panic】内建函数panic停止当前Go程的正常执行

func panic(v interface{})

当函数F调用panic时,F的正常执行就会立刻停止。
F中defer的所有函数先入后出执行后,F返回给其调用者G。
G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。
之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。



自定义错误


errors

包:

func New(text string) error

使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(...))

案例演示:

package main

import (
	"errors"
	"fmt"
)

func readName(name string) error {
	if name == "张三" {
		return nil
	} else {
		// 自定义错误信息,errors.New()是error类型
		return errors.New("你的姓名不对")
	}
}

func test() {
	var err = readName("李四")
	if err != nil {
		// 当函数test调用panic时,test的正常执行就会立刻停止
		panic(err)
	}
	fmt.Println("test函数继续执行")
}

func main() {
	test()
	fmt.Println("main函数继续执行")
}

结果:



【cap】内建函数cap返回 v 的容量

func cap(v Type) int

内建函数cap返回 v 的容量,这取决于具体类型:
	数组:v中元素的数量,与 len(v) 相同
	数组指针:*v中元素的数量,与len(v) 相同
	切片:切片的容量(底层数组的长度);若 v为nilcap(v) 即为零
	信道:按照元素的单元,相应信道缓存的容量;若v为nilcap(v)即为零



【append】内建函数append将元素追加到切片的末尾

func append(slice []Type, elems ...Type) []Type

若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的基本数组。
append返回更新后的切片,因此必须存储追加后的结果。
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)

作为特例,可以向一个字节切片append字符串,如下:
slice = append([]byte("hello "), "world"...)



【copy】内建函数copy将元素从来源切片复制到目标切片中,也能将字节从字符串复制到字节切片中

func copy(dst, src []Type) int

copy返回被复制的元素数量,它会是 len(src)len(dst) 中较小的那个。
来源和目标的底层内存可以重叠。



版权声明:本文为gty204625782原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。