后端go基础|青训营笔记

37 阅读3分钟

这是我参与第五届青训营伴学笔记创作活动的第 1 天

一.go语法基础

  1. 每个变量的都有自己的类型,

  2. go变量的声明和初始化:

    var a ="initial"

    var b string ="initial"

    c :="initial"

  3. for循环,唯一的循环

    for i := 0; i < 3; i++ {

    println("hahaha")

    }

    for{ //死循环

    println("xixixixi")

    break

    }

  4. if else

    if 7%2==0{

    println("fine")

    }else{

    println("fififi")

    }

  5. switch case

    a :=2

    switch a {

    case 1:

    fmt.Println("is 1")

    case 2:

    println("is 2")

    case 3:

    println("is 3")

    }

  6. 数组类型的定义和使用

    var a [5]int

    a[4]=100;

    fmt.Println(a[4],len(a))

  7. 在go中很少用数组,因为数组是固定的,一般是用切片

    s :=make([]string, 3) //通过make创建切片

    s[0]="a"

    s[1]="b"

    s[2]="c"

    fmt.Println(s[2])

    fmt.Println(len(s))

    s =append(s,"d") **//通过append给切片动态扩容,**

    s =append(s,"e","f")

    fmt.Println(s)

    fmt.Println(len(s))

    ``

    c :=make([]string,len(s))

    copy(c,s); //可以通过copy进行切片拷贝

    fmt.Println(s[2:5]) **//取一定范围内的切片**

  8. map集合的介绍,在goland中,map是完全无序的,

    myMap :=make(map[string]int, 10)

    myMap["one"]=1

    myMap["two"]=2

    fmt.Println(myMap["one"])

    valOne,ok :=myMap["one"] //可以通过ok判断key是否存在

    fmt.Println(valOne,ok)

    delete(myMap,"one") //delete删除对应的key-value

  9. goland中的遍历-for range

    //数组的for range

    a :=[]int{1,2,3}

    for i, aa := range a {

    fmt.Println(i,aa)

    }

    //切片的for range

    myMap :=make(map[string]int)

    myMap["one"]=1

    myMap["two"]=2

    for k,v := range myMap {

    fmt.Println(k,v)

    }

  10. 指针

    1. go中的指针和c/c++的指针是比不了的,go中的指针操作很少,主要是用于地址传递修改值。

二.函数

  1. go中的函数返回值可以有多个,对你没看错

  2. 一般第一个是返回真正的值,第二个返回错误信息。

    func func1(info string)(v string,e bool){

    return "ok",true;

    }

三.结构体

  1. go中只有结构体没有类概念

    type Cat struct {

    Age int64 json:"age"

    Name string json:"name"

    }

  2. 结构体可以作为参数传递

    1. 形参可以是指针,这样避免了大结构的拷贝,并且可以修改结构体的值

    2. 结构体方法,我个人感觉go中的结构体的方法很难看,为什么要这样写啊,一点都看不出来是结构体的方法、类成员函数,不如c++、c、java那样清晰,

      func (c Cat) test() {

      fmt.Println(c.Name)

      }

      func (c *Cat) test1() int {

      fmt.Printf("方法中的cat的地址是:%p\n", c)

      c.Name = "bob"

      return 520

      }

    3. 在go中结构体的私有和公有,没有private、public、protected这些修饰。是靠字段第一个字母是否大小写。那么这就带来了问题,在json序列化的时候,我们规定字段第一个字母是小写,这就不符合。

四.错误处理

  1. func dealError(info string)(v string,e error){

    if info=="hello"{

    return "hello",nil

    }

    return "nil",errors.New("not found")

    }

  2. 调用函数就用两个值接收,

五.json序列化

  1. 前面提到了,结构体公有字段首字母要大写,那么我们就要使用tag标签告诉序列化这个字段首字母要小写。

    Age int64 json:"age"

    Name string json:"name"

    jsonCat, err := json.Marshal(cat) //序列化的到的是数组,

    if err == nil {

    fmt.Println(string(jsonCat)) //必须要类型转换,因为序列化的到的不是字符串,

    }