这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
strings
strings.Contains(str,substr); //str中是否包含substr
strings.Count(str,"a"); //str中出现了几次a
strings.HasPrefix(str,"a") // Prefix前缀 Suffix后缀
strings.Index(str,"a") //第一次出现a的元素下标
另外 Replace,Split,ToLower,Join等函数与java用法均类似
切片
s:=make([]string,3)
s = append(s,"d") //要重新赋值给s
c:=make([]string,3)
copy(c,s) // 把s拷贝给c
切片是引用类型,会扩容 对比copy(c,s) 和直接 c=s,前者是拷贝,后者是引用关系,即后者c,s会相互影响 而 append方法需要重新赋值给s,由于在末尾添加元素后可能会导致s的容量不够了,这时 会进行扩容返回一个新的底层数组,长度是原数组的两倍。
Json
结构体中字段定义首字母要大写, 如果需要修改为小写 在后面添加 json:"xxx"
type user struct{
Name string
Age int `json:"age"`
}
u:=user{Name: "kurumi",Age:18}
buf, _ := json.Marshal(u) // json序列化
fmt.Println(string(buf)) //输出
var u1 user
err:=json.Unmarshal(buf,&u1) //json反序列化,将结果存到u1
if err!=nil{
panic(err)
}
fmt.Printf("%+v\n",u1) //{Name:kurumi Age:18}
fmt.Printf("%#v\n",u1) //main.user{Name:"kurumi", Age:18}
%#v 是完整输出
time
now :=time.Now()
fmt.Println(now.Year()) //Month,Day,Minute
fmt.Println(now.Format("2006-01-02 15:04:05")) //时间格式化
用Format方法一定要写这个时间 --速记 2006 1 2 3 4 5
数字解析
num,err:=strconv.Atoi("123") //123
n,err:=strconv.ParseInt("111",0,64) //str,进制,精度, 进制为0自动推测
atoi用于转10进制,当然还有ParseFloat等
其他
rand.Seed(time.Now().UnixNano()) //时间戳作种子
num:=rand.Intn(10) // 生成一个0-10的随机数
var reader int
fmt.Scanf("%d",&reader) //与c中的scanf类似
fmt.Scanln(&reader) //读取一行
在课程中涉及到了defer的使用,但并没有详细讲解,课后自学如下
defer
defer 用来声明其后的函数为延迟函数,可以定义多个延时函数,这些函数会放入到一个栈中,当主函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回
func test() int{
defer func1()
defer func2()
defer func3()
return 0
}
执行顺序是 3,2,1 return 先执行,defer 后的语句后执行。不过,defer执行时是可以改变return中的返回值的。
特别的当defer被声明的时候,如果直接使用了参数,此时的参数就会使用快照值
func test() {
i := 0
defer func(t int) {
fmt.Println(t)
}(i)
//或者写成匿名函数 defer fmt.Println(i)
i++
return
}
输出 i=0, 也就是说在执行到defer这一行时 i 就已经定为0了 这里的变量i是拷贝来的
defer func() {
fmt.Println(i)
}()
如果把代码改成这样子, i并不是作为形参,而是函数内部的值,则i输出为1
总结
主要学习了go的一些基本知识和语法,截取一些比较重要的知识点做记录
defer相关内容转载自zhuanlan.zhihu.com/p/472755815