defer的使用
defer是一种延时机制,可以先执行函数体内其他语句在执行defer后面的语句,并且运行原理为当程序执行到defer语句时,先将defer压入另外的栈中,并且将变量的值也复制一份。当执行完其他的语句后再调用栈中的语句,遵循先入后出的规则来释放栈中的语句。执行完后再执行main函数。这种方式会释放栈中的资源,这样以后我们就不用为何时释放资源而烦恼,提高程序运行效率。
package main
import (
"fmt"
)
func main() {
n1 := 10
n2 := 20
res := sum(n1, n2)
fmt.Println("test4 res=", res)
}
func sum(n1 int, n2 int) int {
defer fmt.Println("test1 n1=", n1)
defer fmt.Println("test2 n2=", n2)
n1++
n2++
res := n1 + n2
fmt.Println("test3 res=", res)
return res
}
值传递和引用传递
变量的作用域
==注意在定义全局变量时,不能直接使用类型推导,也就是 := ,因为:=实际上是两条语句:var i int ,i=xxx;其中i=xxx是赋值语句,不能在函数体外使用,只能在函数体内使用:=符号。
字符串常用内置函数
len(string/arr)
返回字符串的长度,中文占三个字节。与c占两个字节不一样。
package main
import "fmt"
func main() {
a := "hello中"
fmt.Println(len(a))
}
字符串的遍历(包含中文的遍历)
package main
import "fmt"
func main() {
a := "hello中"
r := []rune(a)
for i := 0; i < len(r); i++ {
fmt.Printf("字符=%c\n", r[i])
}
}
字符串数字转成整数
package main
import (
"fmt"
"strconv"
)
func main() {
ts1, err := strconv.Atoi("123")
if err != nil {
fmt.Println("转换错误!")
} else {
fmt.Println("转换成功,结果为:", ts1)
}
ts2, err := strconv.Atoi("hello")
if err != nil {
fmt.Println("转换错误!")
} else {
fmt.Println("转换成功,结果为:", ts2)
}
}
整数转字符串
package main
import (
"fmt"
"strconv"
)
func main() {
str := strconv.Itoa(234)
fmt.Printf("str=%v,str=%T", str, str)
}
字符串转成byte
package main
import "fmt"
func main() {
var bytes = []byte("hello")
fmt.Printf("bytes=%v\n", bytes)
}
byte转字符串
package main
import "fmt"
func main() {
str := string([]byte{97, 98, 99})
fmt.Printf("str=%v", str)
}
进制转换
package main
import (
"fmt"
"strconv"
)
func main() {
test1 := strconv.FormatInt(444, 2)
test2 := strconv.FormatInt(444, 8)
fmt.Printf("test1=%v\n", test1)
fmt.Printf("test2=%v\n", test2)
}
在这里插入代码片
查找字符串是否在指定字符串中
返回值为bool值
package main
import (
"fmt"
"strings"
)
func main() {
test := strings.Contains("hello中国", "中国")
fmt.Printf("结果为:%v", test)
}
查找字符串中有几个指定的字符串
package main
import (
"fmt"
"strings"
)
func main() {
test := strings.Count("chinese", "e")
fmt.Println("test:", test)
test2 := strings.Count("中国是一个国家", "中国人")
fmt.Println("test2:", test2)
}
以不区分大小写的方式比较字符串
test:=strings.EqualFold("abc","Abc")//true
返回子串第一次出现的位置
b:=strings.Index("ASD_abc","abc")//4
注意下标从0开始
没有返回-1。
返回子串最后出现的位置
b:=strings.LastIndex("fyf fyfvv")//4
将指定的字串换成另一个字串
strings.Replace("一个字符串或者字符串数组","被替换的字符","所希望替换的字符",n)
//n=-1时表示全部替换,其他则表示替换的个数
strings.Replace("go go fyf","go","江西",n)//输出:江西 江西 fyf
以某个字符为分割标识,将字符串拆成字符数组
strArry:=strings.Split("hello,world,fyf",",")
fmt.Println(strArry)//输出[hello world fyf]
将字符串进行大小写的转换
str:=strings.ToLower("fyF")//输出fyf
str1:=strings.ToUpper("jxlG")//输出JXLG
将字符串左右两边的空格去掉
strings.TrimSpace(" I am chinese ! ")//将输出"I am chinese !"
将字符串左右两边指定的字串去掉
strings.Trim("! really? !"," !")//将左右两边的空格和!号去掉,将输出"really?"
将左边指定的字符去掉或者右边的去掉
strings.TrimLeft("! hello!"," !")//输出"hello!"注意左边的空格没了
strings.TrimRight("! hello! !"," !")//输出"! hello"
判断字符串是否以指定字符串开头或结尾
strings.HasPrefix("http://aaa","http")//true
strings.HasSuffix("asddd","sj")//false
time时间函数
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now)
fmt.Println(now.Year()) //输出当前年份,同理还有月份,日期等函数
//另一种格式化输出
fmt.Println(now.Format("2006-01-02 15:04:05")) //其中format函数中的数字不能改
fmt.Println(now.Format("2006")) //输出当前年份
}
time时间常量的使用与sleep的结合
package main
import (
"fmt"
"time"
)
func main() {
i := 0
for {
i++
fmt.Println(i)
time.Sleep(time.Second * 3) //每过三秒打印i
if i == 10 {
break
}
}
}
unix时间戳
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Printf("unix=%v unixnano=%v", now.Unix(), now.UnixNano()) //unixnano精确到纳秒
}