Go进阶(4): string接口函数 时间接口函数 内置函数 错误处理

1.string接口函数len():内建函数,返回字符串/数组的长度,按字节(UTF-);例如,ascii字符占一个字节,汉字占三个字节;r:=[]rune(str):字符串遍历函数,同时可以处理中文问题,中间是转成了slicer类型packagemainimport"fmt"funcmain()str:="hello沈子恒"fori:=0;i<len(str);i //会出现中文乱码情况...

Go进阶(4): string接口函数 时间接口函数 内置函数 错误处理
1. string接口函数
  • len():内建函数,返回字符串/数组的长度,按字节(UTF-);例如,ascii字符占一个字节,汉字占三个字节;
  • r:=[]rune(str):字符串遍历函数,同时可以处理中文问题,中间是转成了slicer类型
package mainimport "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 mainimport ("fmt""reflect")func main() {num1 := 100fmt.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 mainimport "fmt"func test(){defer func() {err := recover()if err != nil {fmt.Println("Error:", err)}}()num1 := 10num2 := 0res :=  num1/num2fmt.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类型的量,输出错误信息,并退出程序。

源文地址:https://www.guoxiongfei.cn/csdn/7973.html