GO学习之 常用系统函数_字符串相关函数_时间函数_内置函数
一.常用的字符串函数
后面的一些需要导入strings包
//(1)统计字符串的长度,按字节len(str)
package main
import "fmt"
func main() {
// 统计字符串的长度,按字节
// 一个英文字母占用一个字节
// utf8中一个中文编码一个字符三个字节
str := "hello东"
fmt.Println("str len=",len(str)) // 8
}
//(2)字符串变量,同时处理有中文的问题 r :[] rune(str)
str2 := "hello深圳"
// 有中文的话,需要转rune
str3 := []rune(str2)
for i := 0; i < len(str3); i++ {
fmt.Printf("字符=%c\n",str3[i])
}
//(3)字符串转整数: n.err = stronv.Atoi(“123”)
// 字符串转整数:n,err := strconv.Atoi("12")
n, err := strconv.Atoi("123")
if err != nil{
fmt.Println("转换错误",err)
} else {
fmt.Println("转成的结果是",n)
}
//(4)整数转字符串: str = strconv.Itoa(“hello”)
// 整数转字符串
str4 := strconv.Itoa(12345)
fmt.Printf("str=%v, str_type=%T",str4,str4)
//(5)字符串转byte
// 字符串转byte
var bytes = []byte("hello go")
fmt.Printf("bytes=%v\n",bytes)
//(6)byte转字符串
// byte 转字符串
str5 := string([]byte{97, 98, 99})
fmt.Println("str5=", str5)
//(7)10 进制转 2,8,16进制
// 10 进制转 2,8,16进制 返回对应的字符串
str6 := strconv.FormatInt(123, 2)
fmt.Printf("123对应的二进制是=%v\n",str6)
str7 := strconv.FormatInt(123,8)
fmt.Printf("123对应的8进制是=%v\n",str7)
str8 := strconv.FormatInt(123,16)
fmt.Printf("123对应的16进制是=%v\n",str8)
//(8)查找子串是否在指定的字符串中
需要导入strings
// 查找子串是否在指定的字符串中
is_in := strings.Contains("hszllo","llo")
fmt.Println("是否存在",is_in)
//(9)统计一个字符串中有几个指定的子串
// 统计一个字符串中有几个指定的子串
num := strings.Count("hahahahahhahah", "ha")
fmt.Printf("出现%v次",num)
//(10)不区分大小的字符串比较(==是字母大小写的)
// 不区分带小写比较
is_eq := strings.EqualFold("ASD","asd")
fmt.Println("是否相同",is_eq)
//(11)返回子串在字符串中第一个出现的index值,如果没有返回-1
// 返回子串Index值
index := strings.Index("NNN_ABC","ABC")
fmt.Println("返回index=",index)
//(12)返回子串最后一次出现的index,如果没有返回-1
// 返回子串最后一次出现的index,如果没有返回-1
index_02 := strings.LastIndex("go go go goLang","go")
fmt.Println("最后一次出现index=",index_02)
//(13)字符串的替换
strings.Replace(“hello go go go”,”go”,”go 语言”,n)
n 可以指定希望替换几个,如果n=-1表示全部替换
//字符串的替换
rp_str := strings.Replace("hello go go go","go","go 语言",3)
fmt.Println("替换后的结果:",rp_str)
//(14)字符串的分割,才分为字符串数组
// 字符串的分割,才分为字符串数组
strArr := strings.Split("hello,world,ok",",")
fmt.Println("strArr=",strArr)
// 遍历数组
for i := 0 ; i <len(strArr); i++ {
fmt.Println(strArr[i])
}
//(15)字符串中的带小写转换
// 字符串中的带小写转换
// strings.ToLower("GO")
// strings.ToUpper("go")
res1 := strings.ToLower("GO")
fmt.Println("变成小写:",res1)
res2 := strings.ToUpper("go")
fmt.Println("变成大写:",res2)
//(16)字符串左右空格去掉
// 字符串左右空格去掉
new_str_01 := strings.TrimSpace(" hello go ! ")
fmt.Println("去掉空格的:",new_str_01)
//(17)字符串去掉左右两边的字符串
// 去掉左右两边指定的字符串
new_str_02 := strings.Trim("!!hello go !!","!!")
fmt.Println("去掉左右两边指定的!:",new_str_02)
//(18)字符串去掉左边指定字符串
// 去掉左边指定的字符串
new_str_03 := strings.TrimLeft("!!hello go ! ","!!")
fmt.Println("去掉左边指定的!:",new_str_03)
//(19)字符串去掉右边指定的字符串
// 去掉右边指定的字符串
new_str_04 := strings.TrimRight("!!hello go !!","!!")
fmt.Println("去掉右边指定的!:",new_str_04)
//(20)判断字符串是否以指定的字符串开头
// 判断字符串是否以指定的字符串开头
is_start := strings.HasPrefix("ftp://127.0.0.1","ftp")
fmt.Println("是否为ftp开头:",is_start)
//(21)判断字符串是否以指定的字符串结尾
// 判断字符串是否以指定的字符串结尾
is_end := strings.HasSuffix("www.baidu.com","com")
fmt.Println("是否为com结尾:",is_end)
二.常用的时间与日期函数
时间和日期相关函数,需要导入time包
1.time.Time 时间类型
例:
package main
import (
"fmt"
"time"
)
func main() {
// 日期和时间相关函数与方法的使用
// 1.获取当前时间
now := time.Now()
fmt.Printf("当前时间为:now=%v\n时间类型为:time_type=%T\n",now,now)
// 打印结果:
// 当前时间为:now=2020-03-15 17:59:06.3353254 +0800 CST m=+0.002996901
// 时间类型为:time_type=time.Time
// 通过now获取到年月日,时分秒
fmt.Printf("年=%v\n",now.Year())
fmt.Printf("月=%v %v\n",now.Month(),int(now.Month())) // 英文的 数字加int强转
fmt.Printf("日=%v\n",now.Day())
fmt.Printf("时=%v\n",now.Hour())
fmt.Printf("分=%v\n",now.Minute())
fmt.Printf("秒=%v\n",now.Second())
fmt.Printf("周=%v\n",now.Weekday())
}
2.格式化日期和时间
方式一:
例:
port (
"fmt"
"time"
)
func main() {
// 格式化日期时间
now := time.Now()
fmt.Printf("当前年月日 时分秒 %02d-%02d-%02d %02d:%02d:%02d\n",
now.Year(),now.Month(),now.Day(),
now.Hour(),now.Minute(),now.Second())
dateStr := fmt.Sprintf("当前年月日 时分秒 %02d-%02d-%02d %02d:%02d:%02d\n",
now.Year(),now.Month(),now.Day(),
now.Hour(),now.Minute(),now.Second())
fmt.Printf("%v %T",dateStr,dateStr)
}
方式二:使用time.Format("2006/01/02 15:04:05")
例:
package main
import (
"fmt"
"time"
)
func main() {
// 格式化日期时间
now := time.Now()
// "2006/01/02 15:04:05" 这个字符串的各个数字是固定的,必须是这样写
// "2006/01/02 15:04:05" 这个字符串各个数字可以自由的组合,这样可以按程序需求来返回时间和日期
fmt.Println(now.Format("2006/01/02 15:04:05"))
// 只输出年月日
fmt.Println(now.Format("2006/01/02"))
// 只输出时分秒
fmt.Println(now.Format("15:04:05"))
}
3.时间的常量
const(
Nanosecond Duration = 1 // 纳秒
Microsecond = 1000 * Nanosecond Duration // 微秒
Millisecond = 1000* Microsecond // 毫秒
Second = 1000*Millisecond // 秒
Minute = 60 * Second // 分钟
Hour = 60* Minute // 小时
)
常量的作用:在程序中可用于获取指定时间单位的时间,比如想得到100毫秒 100 * time.Millisecond
休眠:
time.Sleep(1000*time*Millisecond) // 休眠100毫秒
例:
i := 0
for {
i ++
fmt.Println(i)
time.Sleep(time.Second)
if i >= 10 {
break
}
}
4.获取unix时间戳和unixnano时间戳
作用是可以获取随机的数字
从1970年1月1日0时0分0秒 到现在的时间
例子:
package main
import "fmt"
import "time"
func main() {
now := time.Now()
// Unix 和 UnixNamo
fmt.Printf("uinx时间戳=%v \nunixnano时间戳=%v",now.Unix(),now.UnixNano())
}
例:计算程序运行时间
package main
import "fmt"
import "strconv"
import "time"
func test() {
str := ""
for i := 0 ; i < 100000; i++ {
str += "hello" + strconv.Itoa(i)
}
}
func main() {
start := time.Now().Unix()
test()
end := time.Now().Unix()
fmt.Printf("执行程序耗费时间为%v秒",end-start)
}
三.内置函数builtin
Golang设计者为了编程方便,提供了一些函数,这些函数可以直接使用,我们称为GO的内置函数。
文档:https://studygolang.com/pkgdoc -> builtin
1.len
用来求长度,比如:string,array,slice,map,channel
2.new
用来分配内存,主要用来分配值类型,比如int,float32,struct...返回的是指针
举例:
package main
import "fmt"
func main() {
//
num1 := 100
fmt.Printf("num1的类型%T,num1的值=%v,num1的地址%v\n",num1,num1,&num1)
num2 := new(int) // num2是指针
// 指针的值是一个地址
// num2 的类型%T => *int
// num2 的值 = 地址 0xc0000540a0
// num2的地址 = 0xc000080020
// 修改num2 指向的的值
*num2 = 100
fmt.Printf("num2的类型%T,num2的值=%v,num2的地址%v 指向的值=%v\n",num2,num2,&num2,*num2)
}
3.make
用来分配内存,主要用来分配引用类型,比如channel、map、slice。
4.错误处理
默认情况下代码逻辑或语法错误,会报错。
如果让报错跳过继续运行就需要使用到错误处理机制。
基本说明:
(1)GO语言追求简洁优雅,所有,GO语言不支持传统的try...catch..finally (java)这种处理
(2)GO中引入的处理方式为:defer,panic,recover
(3)GO中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
举例:defer + recover
package main
import "fmt"
func test() {
// 使用defer + recover 来捕获和处理异常
defer func() {
err := recover() //内置函数recover可以捕获到异常
if err != nil { // 说明捕获到异常或错误
fmt.Println("err=",err)
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=",res)
}
func main() {
//
test()
// 下面的代码正常指向
fmt.Println("test() 后运行的")
}
错误处理的好处:
进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。
自定义错误
GO程序中,也支持自定义错误,使用errors.New和panic内置函数。
(1)errors.New(“错误说明”),会返回一个error类型的值,表示一个错误
(2)panic内置函数,接收一个interface{} 类型的值(也就是任何值),作为参数。可以接收error类型的变量,输出错误信息,并退出程序。
举例:自定义错误
package main
import (
"errors"
"fmt"
)
// 函数去读取以配置文件init.conf的信息
// 如果文件名传入不正确,我们就返回一个自定义的错误
func readConf(name string) (err error) {
if name == "config.ini" {
// 读取
return nil
} else {
// 返回一个自定义错误
return errors.New("读取文件错误...")
}
}
func test() {
err := readConf("config.ini2") // 看传的文件名是否正确,不正确就报错
if err != nil {
// 如果读取文件发送错误,就输出这个错误,并终止程序
panic(err)
}
fmt.Println("test继续执行")
}
func main() {
// 自定义错误的使用
test()
fmt.Println("运行main()后面的代码")
}

浙公网安备 33010602011771号