1. string接口函数
- len():内建函数,返回字符串/数组的长度,按字节(UTF-);例如,ascii字符占一个字节,汉字占三个字节;
- r:=[]rune(str):字符串遍历函数,同时可以处理中文问题,中间是转成了slicer类型
package main
import "fmt"
func main() {
str := "hello 沈子恒"
for i:=0; i<len(str); i++{ //会出现中文乱码情况
fmt.Printf("字符%c ", str[i])
}
str_rune := []rune(str)
for i:=0; i<len(str_rune); i++{ //会出现中文乱码情况
fmt.Printf("字符%c ", str_rune[i])
}
}
运行结果:
字符=h 字符=e 字符=l 字符=l 字符=o 字符= 字符=æ 字符=² 字符= 字符=å 字符= 字符= 字符=æ 字符= 字符=
字符=h 字符=e 字符=l 字符=l 字符=o 字符= 字符=沈 字符=子 字符=恒
- n, err = strconv.Atoi(str):字符串转Int类型,err可以打印错误信息;如,“123”可以转成Int,而“hello”不可以;通常用于输入类型的校验
- str = strconv.itoA(): 转成字符串
- var bytes = []byte("hello go"): 字符串转成字符,采用了[]byte切片
- str = string([]byte{97,98,99}): 字符list转成字符串
- str = strconv.FormatInt(int num, 2/8/16): 10进制转成2/8/16进制
- strings.Contains("seafood", "foo"): 字符串中是否包含字串
- strings.Count(“cheese”,"e"): 字符串中包含字串的数量
- stringsEqualFold(“abc”, "ABC"): 不区分大小写判断字符串是否相等 (区别==,区分大小写)
- strings.Index("helloworld","wor"): 返回子串在字符串中第一次出现的index,如果没有返回-1
- strings.LastIndex("go golang", "go"): 返回子串在字符串中最后出现的位置
- strings.Replace("go golang", "go", "go语言", 1):字符串替换,-1指全部替换,1指从前向后检索的第一个子串
- strings.Split("hello golang, hello world", ","): 按照指定字符切分字符串,形成字符串数组
- strings.Lower("HELLO") / strings.Upper("hello"): 字符串转成小写/大写
2. 时间/日期接口函数(time包)
- now := time.Now(): 获取当前的时间
- now.Year() now.Month() now.Day() now.Hour() now.Minute() now.Second() : 获取年月日时分秒
- now.Format: 格式化日期时间格式
- time.Sleep(100 * time.Millisecond): 休眠时间
3. 内置函数new和make
- new:用来分配内存,主要用来分配值类型,比如int / float32 / struct ... 返回的是指针
package main
import (
"fmt"
"reflect"
)
func main() {
num1 := 100
fmt.Println("num1的类型, 值%v, 地址%v:", reflect.TypeOf(num1), num1, &num1)
num2 := new(int)
fmt.Println("num2的类型, 值%v, 地址%v:", reflect.TypeOf(num2), num2, &num2)
}
运行结果:
num1的类型, 值, 地址: int 100 0xc000062058
num2的类型, 值, 地址: *int 0xc000062090 0xc00008e020
- make: 用来分配内存,主要用来分配引用类型,比如channel / map / slice
4. 错误处理
默认情况下,程序发生错误后(panic),程序就会退出;如果我们希望,当发生错误后,程序可以捕捉错误,及时发送错误报告,并正常执行后下面的正确代码。
Go不支持传统的try...catch...finally处理机制;引入了defer / panic / recover进行处理;即Go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,然后进行正常处理。
- panic-defer-recover
package main
import "fmt"
func test(){
defer func() {
err := recover()
if err != nil {
fmt.Println("Error:", err)
}
}()
num1 := 10
num2 := 0
res := num1/num2
fmt.Println(res)
}
func main() {
test()
fmt.Println("程序可以正常执行...")
}
运行结果:
Error: runtime error: integer divide by zero
程序可以正常执行...
- errors.New和panic
Go程序中,也支持自定义错误,使用errors.New()和panic内置函数。
errors.New(“错误说明”),会返回一个error类型的值,表示一个错误;
panic内置函数,接受一个interface{}类型的值作为参数,可以接受error类型的量,输出错误信息,并退出程序。