Go基础 | 青训营笔记

85 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

优点

  • 高性能、高并发
  • 语法简单、学习曲线平缓
  • 标准库丰富
  • 工具链丰富
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

基础变量

变量声明:

 var name = value
 var s = "s"

常量:

 const name = value
 const s string = "aa"

= 是赋值 := 是声明变量并赋值

语句

if

 if 条件 {
 ​
 }
 ​
 if 条件 {
 ​
 }else{
 ​
 }
 ​

for

 for i:=0 ; i<10 ; i++ {
 ​
 }
 //continue;
 //break;

switch

 switch a{
 case 1 :
     ..
 case 2 :
     ..
 defalt:
     ..
 }

数组

 var a [5]int
 var a [2][3]int

切片

 var s []type = make([]type, len)
 s := make([]string,3)
 s = append(s,"d") //添加
 copy(目标切片,源头切片)
 s[0:2] //取出 (前闭后开)
 s := []string{"a","b","c"} //s[0]="a"..

map

 m := make(map[string]int)
 m["hello"]=1
 r,ok:= m["hello"] //是否存在 r=1,ok=true 
 delete(m,"hello") //删除

range

     m := make(map[string]int)
     m["hello"] = 1
     m["hi"] = 2
     m["say"] = 3
 ​
     for k, v := range m {
         fmt.Println(k, v)
     }
 /**
 hello 1
 hi 2
 say 3
 */

函数

 //支持多返回值
 func f1(a int, b int) int{
     return a + b
 }
 ​
 func f2(m map[string]int, k string)(v int, ok bool){
     v, ok = m[k]
     return v,ok
 }
 ​
 /**
 println(f2(m, "hello"))
 1 true
 */

指针

 func f1(a *int, b *int) int{
     a += b
     b += a
     return a + b
 }
 ​
 f1(&a,&b)

结构体

 type stu struct {
     name string
     no int
 }
 ​
 func main() {
     a := stu{"liming",1}
     b := stu{name:"qiqi"}
     b.no = 1 
 }

结构体方法

 type stu struct {
     name string
     no   int
 }
 ​
 func (s stu) printStu(name string, no int) {
     println(s.name, s.no)
 }
 ​
 func main() {
     a := stu{"liming", 1}
     b := stu{name: "qiqi"}
     b.no = 1
     a.printStu(a.name, a.no)
 }

错误处理

此处结果返回值必须为引用类型,会存在空指针情况

 type stu struct {
     name string
     no   int
 }
 ​
 func f3(stus []stu, name string) (stu *stu, err error) {
     for _, v := range stus {
         if v.name == name {
             return &v, nil
         }
     }
     return nil, errors.New("未找到")
 ​
 }
 ​
 func main() {
     var a = stu{name: "hello", no: 1}
     var b = stu{name: "hello2", no: 1}
     c := []stu{a, b}
     v, e := f3(c, "hello")
     fmt.Println(v, e)
     v, e = f3(c, "hello7")
     fmt.Println(v, e)
 }
 /**
 &{hello 1} <nil>
 <nil> 未找到
  */

字符串格式化

格式化输出函数为printf

 func main() {
     var a = stu{name: "hello", no: 1}
     var b = stu{name: "hello2", no: 1}
     c := []stu{a, b}
     v, e := f3(c, "hello")
     fmt.Printf("v=%v\ne=%v\n", v, e)
     fmt.Printf("+v=%+v\ne=%v\n", v, e)
     fmt.Printf("#v=%#v\ne=%v\n", v, e)
     fmt.Printf("%.2f", 2.336)
 }
 ​
 /**
 v=&{hello 1}
 e=<nil>
 +v=&{name:hello no:1}
 e=<nil>
 #v=&main.stu{name:"hello", no:1}
 e=<nil>
 2.34
 */

JSON处理

结构体属性第一个字符必须大写

 type stu struct {
     Name string
     No   int
 }
 ​
 func main() {
     a := stu{Name: "liming", No: 1}
     buf, err := json.Marshal(a)
     if err == nil {
         println(string(buf))
     }
     var b stu
     err = json.Unmarshal(buf, &b)
     if err == nil {
         fmt.Printf("%v", b)
     }
 }
 /**
 {"Name":"liming","No":1}
 {liming 1}
  */
 ​

时间处理

导包 time

 func main() {
    now := time.Now()
    fmt.Println(now)
    //自行构造时间
    t := time.Date(2022, 3, 15, 11, 25, 36, 0, time.UTC)
    t2 := time.Date(2023, 3, 15, 11, 25, 36, 0, time.UTC)
    fmt.Println(t)
    fmt.Println(t.Year())
    //格式化 必须为这个时间
    fmt.Println(t.Format("2006-01-02 15:04:05"))
 ​
    //日期差
    diff := t2.Sub(t)
    fmt.Println(diff)
    diff.Hours()
 ​
    //转化为时间类型
    t3, err := time.Parse("2006-01-02 15:04:05", "2017-08-06 17:15:16")
    if err == nil {
       fmt.Println(t3)
    }
 ​
    //获取时间戳
    fmt.Println(now.Unix())
 ​
 }
 ​
 /**
 2022-05-07 13:24:09.7027718 +0800 CST m=+0.002074101
 2022-03-15 11:25:36 +0000 UTC
 2022
 2022-03-15 11:25:36
 8760h0m0s
 2017-08-06 17:15:16 +0000 UTC
 1651901049
 */

字符串数字转化

 import "strconv"
 ​
 func main() {
 ​
    f, _ := strconv.ParseFloat("1.3254", 64)
    println(f)
 ​
    //进制为0表示去推测进制  最后一个参数为位数
    n, _ := strconv.ParseInt("12006", 10, 64)
    println(n)
 ​
    nn, _ := strconv.Atoi("123")
    println(nn)
 ​
    i := strconv.Itoa(123)
    println(i)
 }
 ​
 /**
 +1.325400e+000
 12006
 123
 123
 */