Go 语言基础 & 实战案例 | 青训营笔记

50 阅读2分钟

语言基础

  • Go 语言在C语言的基础上 进行了大幅度的简化,学习容易

  • 垃圾回收:

    • 写代码是无需考虑垃圾回收,类似JAVA
  • 指针pointer:

    • &传参数
    • *接收参数
    • 用pointer可改变结构体内容、值
  • fmt.Printf

    • "%v": 反应任意类型的变量,而不需要区分,如数字用%d或字符串用%s

    • "%+v"、"%#v"可获取更详细的信息:(e.g. p:= point{1, 2})

      • "%+v": {x:1, y:2}
      • "%#v": main.point{x:1, y:2}
    • 打印小数后几位

      • "%.2f" // 保留两位小数
  • JSON结构体

    • 首字母大写
    • 可用json.Marshal序列化,后用string()打印出,否则回答出遗传编码
    • 可用json.Unmarshal反序列化,传入空值b中 json.Unmarshal(buf, &b)
  • Time

    • t.format参数用一个具体的时间
    • 可用Unix()获得时间戳
  • 类型转换

    • 可用 ParseFloat/ParseInt 进行转换

    • Atoi (String -> Integer) / Itoa(Integer -> String)

实战案例

guessing-game

  • 随机数 math/rand

  • 需设置随机数种子 rand.Seed(time.Now().UnixNano()),否则每次都会生成同一个数,一般使用当前时间的时间戳

  • 读取输入可以用os.Stdin

    • E.g.

    •   '''

    •    reader := bufio.NewReader(os.Stdin) // 读取器

    •    input, err := reader.ReadString('\n') // 读取输入的字符串

    •    if err != nil { // 若输入出错

    •    fmt.Println("An error occured while reading input. Please try again", err)

    •    return

    •    }

    •    input = strings.Trim(input, "\r\n") // 将输入的字符串去空格去转换符

    •    guess, err := strconv.Atoi(input) // 将字符串转换为整型数值

    •    if err != nil { // 若不能转换,则报错

    •    fmt.Println("Invalid input. Please enter an integer value")

    •    return

    •    }

    •   '''

  • while(true) -> for{ if(```) break }

simple-dict

调用第三方api,接受http请求

  • 将curl命令转换为go -> curlconverter.com
  • 写结构体与response一一对应(繁琐且容易出错),代码生成(解析responce body) -> oktools.net/json2go

代码流程:

'''

// 创建请求

// data是流 占用内存少

var data = bytes.NewReader(buf) // 此处返回byte数组

req, err := http.NewRequest("POST", "api.interpreter.caiyunai.com/v1/dict", data)

if err != nil {

log.Fatal(err)

}

if err != nil {

log.Fatal(err)

}

//设置请求头

....

// 发起请求

resp, err := client.Do(req)

if err != nil { // 连接失败的话

log.Fatal(err) // 退出进程

}

defer resp.Body.Close() // 返回同样是个流,close防止泄露

bodyText, err := ioutil.ReadAll(resp.Body) // 把流读到内存

if err != nil {

log.Fatal(err)

}

// 反序列化,解析responce

resp, err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer resp.Body.Close()

bodyText, err := ioutil.ReadAll(resp.Body)

if err != nil {

log.Fatal(err)

}

var dictResponse DictResponse

err = json.Unmarshal(bodyText, &dictResponse) // 反序列化

if err != nil {

log.Fatal(err)

}

fmt.Printf("%#v\n", dictResponse)

'''