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类型的量,输出错误信息,并退出程序。

09-16 11:06