go基础入门 | 青训营笔记

69 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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