文章目录
- Go学习-Day4
- 函数
- 值传递,引用传递
- 常用的函数
- 异常处理
- 数组
- Slice切片
Go学习-Day4
- 个人博客:CSDN博客
函数
值传递,引用传递
- 值传递直接拷贝值,一般是基本数据类型,数组,结构体也是
- 引用传递传递地址 ,效率高,指针,slice切片,map,管道,interface等
常用的函数
-
len(string str)//求字符串长度,自带的不用包,中文一个字三字节
-
转成[]rune来处理
-
[]byte转string
-
str = string([]byte{...})
-
查找子串是否存在
-
若干字符函数
-
strings.Contains("aaa", "aaa") //bool strings.Index("aaa", "aaa")//返回下标 strings.LastIndex("aaa", "aaa")//返回最后一个下标,没有就返回-1 strings.Replace(str, str1, str2, n)//把1中str1替换成str2,n是替换个数,-1表示全部替换 strings.Split(str, "某字符")//分割字符串 strings.TrimSpace(str)//裁剪空格,去掉前导和后导空格 strings.Trim(str, "字符集")//去掉指定字符 strings.TrimLeft()//同上,去掉左侧,并且还有TrimRight strings.HasPrefix(str, "后缀")//前缀匹配 strings.HasSuffix()//同上,但是后缀
-
若干时间函数
-
now := time.Now()//返回时间类型,当前时间 //2023-08-23 16:37:07.5402748 +0800 CST m=+0.001148901 大概是这样 //时间类型是结构体,可以使用.运算符来获取其他时间信息,now.Year() //月份可以直接转int time.Sleep(time.Millisecond * 100)//只能用乘法,不能有浮点数,利用时间单位常量 time.Unix()//获取unix秒时间戳 time.UnixNano()//unix纳秒时间戳
-
内置函数built-in
-
len()//统计字符串长度,数组大小 new(Type) *Type //参数为类型,返回一块对应大小的清空的内存块的指针
异常处理
-
Go中没有try catch
-
Go利用defer panic recover来处理异常
-
抛出一个panic的异常,在defer中通过recover捕获异常
-
package mainimport "fmt"func test() {defer func() {err := recover() //捕获异常if err != nil {fmt.Println(err)}}()num1 := 10num2 := 0res := num1 / num2fmt.Println(res) } func main() {test()fmt.Println("ok") }
-
通过捕获异常,可以使得程序不崩溃停止!main函数的其他部分照常运行
-
自定义错误
-
func myError(x int) (err error) {if x == 0 {return nil} else {return errors.New("错误")} }func test() {err := myError(1)if err != nil {panic(err)} }func main() {test() }
-
panic会终止程序
-
捕获自定义错误
-
func myError(x int) (err error) {if x == 0 {return nil} else {return errors.New("错误")} }func test() {defer func() {err := recover() //捕获异常if err != nil {fmt.Println(err)}}()err := myError(1)if err != nil {panic(err)} }func main() {test()fmt.Println("ok") }
数组
-
定义
-
func main() {var arr [10]intarr[0] = 1fmt.Println(arr)}
-
数组名地址&arr
-
初始化
-
var arr [3]int = [3]int{1, 2, 3}var arr = [3]int{1, 2, 3}var arr = [...]int{1, 2, 3}var arr = [...]int{1: 800, 0: 900, 2: 999}//指定下标var arr := [...]int{1, 2, 3} //自动推导
-
遍历for-range 同string 不赘述
-
数组中的元素可以是任何合法的类型,但是不能混用
-
Go中数组是值类型,会进行拷贝,要想修改原数组,需要使用指针,写法类似C语言的行指针
Slice切片
-
切片是引用类型,传递地址
-
切片和数组类似,但是长度是可以变化的!
-
声明
-
var a []int
-
func main() {var arr [5]int = [...]int{1, 2, 3, 4, 5}slice := arr[1:3] //从下标1与下标3,左闭右开的区间fmt.Println(slice) }
-
通过make声明
-
func main() {slice := make([]int, 2, 4)fmt.Println(slice) }
-
make在底层维护一个数组,这个数组对外不可见
-
直接声明
-
var slive []string = []string
-
遍历和数组类似,不再赘述
-
简写
-
var slice = arr[:end] // var slice = arr[0:end]前缀,不含end var slice = arr[start:]//var slice = arr[start:]后缀 var slice = arr[:]//var slice = arr[0:len(arr)]全长
-
切片可以继续切片
-
切片可以追加,可以追加多个数,可以追加多个切片,利用append将追加后的切片赋值给原来的切片
-
slice1 = append(slice1, 1, 2, 3)//追加数 slice1 = append(slice1, slice1...)//要三个点
-
Go底层会创建一个新的数组,然后切片这个新的数组,这些过程均不可见
-
string可以进行切片处理
-
str := "sssssss" slice := str[2:]//从下标2开始切后缀
-
string底层也指向一个byte数组,我们用切片来拷贝这个只读的byte数组再进行操作
-
通过切片能够改变字符串
-
arr := byte[](str) arr[0] = 'a' str = string(arr) //但是不支持中文 arr := rune[](str) arr[0] = '好' str = string(arr) //弄中文 func main() {str := "?????"arr := []rune(str)arr[0] = '好'fmt.Println(string(arr)) }