Go语言快速入门 | 青训营笔记

118 阅读4分钟

课程概述

  1. Go语言简介
  2. Go语言开发环境、基础语法、标准库
  3. 实践开发

简介

Go语言是Google公司开发的静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,于2009年正式推出并开放了源代码项目。 Go语言又习惯称Golang(原因是Go.org已经被注册,所以Go语言用golang.org作为官网,并且它流行起来之前搜索引擎搜索Go这样一个简单的词汇很难搜索到相关内容,所以人们使用Golang作为关键词,一直延续到今天)

特点

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

目前 Go 语言支持 Windows、Linux 等多个平台,也可以直接在 Android 和 iOS 等移动端执行,从业务角度来看,Go 语言在云计算、微服务、大数据、区块链、物联网、人工智能等领域都有广泛的应用,国内外有约来越多的公司使用Go语言作为主要开发语言

快速入门

开发环境

可以选择VsCode、Goland等主流IDE进行开发, 甚至可以使用基于云的开发环境,例如:gitpod.io/#github.com…

基础语法

  1. 循环:for语句而没有while语句
  2. switch语句也去掉了繁琐的小括号和break语句
  3. 数组:相对不那么灵活(定长),我们常常使用切片进行灵活的操作
  4. map,就是哈希表,类似于c++的方式存取
  5. for range语句,类似于其他语言的for-each语句,但是Go语言可以同时获取集合的下标和值
  6. 函数:比较有特点的是,Go语言的函数可以有多个返回值,一般是一个正常的返回值,外加错误信息
  7. 指针:相比C++的指针,受到了很大的限制
  8. 结构体:Go语言没有类这样一个概念,我们用结构体和接口模拟面向对象
  9. 结构体方法:可以将函数标记为某个结构体的方法,类似于其他语言的类的成员方法
  10. 错误处理:一般通过error类包装返回错误信息

实践开发

猜谜小游戏

完成这样一个小实践,体会了:

  1. 随机数种子、随机数的使用
  2. 读取用户的输入
  3. 循环、选择、switch的使用
  4. 简单的异常处理
  5. 字符串的处理、转化

给出一个100以内的随机数作为谜底,输入一个数进行比较,如果与谜底不同会提示是偏大还是偏小,直到猜出正确答案为止,源代码如下:

package main
​
import (
   "bufio"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "time"
)
​
func main() {
   //获取secret
   rand.Seed(time.Now().Unix())
   intn := rand.Intn(100)
   reader := bufio.NewReader(os.Stdin)
   fmt.Println("please enter a number in 100")
   for {
      readString, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("read a number failed", err)
         continue
      }
      readString = strings.Trim(readString, "\n")
      guessNumber, err := strconv.Atoi(readString)
      if err != nil {
         fmt.Println("please enter a number not others", err)
         continue
      }
      switch {
      case guessNumber == intn:
         fmt.Println("you are right!")
         break
      case guessNumber < intn:
         fmt.Println("the number you guessed is smaller than the right answer")
      case guessNumber > intn:
         fmt.Println("the number you guessed is larger than the right answer")
      }
   }
​
}

演示结果如下:

image-20230115160101894.png

在线词典

通过在线调用翻译网站的API,实现简单的翻译功能,主要涉及到http包的使用,实现api调用和接收并处理返回的数据。代码如下:

package main
​
import (
  "bufio"
  "bytes"
  "encoding/json"
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
  "os"
  "strings"
)
​
type Data struct {
  TransType string `json:"trans_type"`
  Source    string `json:"source"`
  UserId    string `json:"user_id"`
}
type DicResponse struct {
  Rc   int `json:"rc"`
  Wiki struct {
    KnownInLaguages int `json:"known_in_laguages"`
    Description     struct {
      Source string      `json:"source"`
      Target interface{} `json:"target"`
    } `json:"description"`
    ID   string `json:"id"`
    Item struct {
      Source string `json:"source"`
      Target string `json:"target"`
    } `json:"item"`
    ImageURL  string `json:"image_url"`
    IsSubject string `json:"is_subject"`
    Sitelink  string `json:"sitelink"`
  } `json:"wiki"`
  Dictionary struct {
    Prons struct {
      EnUs string `json:"en-us"`
      En   string `json:"en"`
    } `json:"prons"`
    Explanations []string      `json:"explanations"`
    Synonym      []string      `json:"synonym"`
    Antonym      []string      `json:"antonym"`
    WqxExample   [][]string    `json:"wqx_example"`
    Entry        string        `json:"entry"`
    Type         string        `json:"type"`
    Related      []interface{} `json:"related"`
    Source       string        `json:"source"`
  } `json:"dictionary"`
}
​
func main() {
  //读取数据
  reader := bufio.NewReader(os.Stdin)
  word, _ := reader.ReadString('\n')
  word = strings.Trim(word, "\n")
​
  //封装数据
  client := &http.Client{}
  //var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
  request := Data{
    TransType: "en2zh",
    Source:    word,
  }
  buffer, _ := json.Marshal(request)
  data := bytes.NewReader(buffer)
  req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
  if err != nil {
    log.Fatal(err)
  }
  req.Header.Set("authority", "api.interpreter.caiyunai.com")
  req.Header.Set("accept", "application/json, text/plain, */*")
  req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
  req.Header.Set("app-name", "xy")
  req.Header.Set("content-type", "application/json;charset=UTF-8")
  req.Header.Set("device-id", "")
  req.Header.Set("origin", "https://fanyi.caiyunapp.com")
  req.Header.Set("os-type", "web")
  req.Header.Set("os-version", "")
  req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
  req.Header.Set("sec-ch-ua", `"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"`)
  req.Header.Set("sec-ch-ua-mobile", "?0")
  req.Header.Set("sec-ch-ua-platform", `"macOS"`)
  req.Header.Set("sec-fetch-dest", "empty")
  req.Header.Set("sec-fetch-mode", "cors")
  req.Header.Set("sec-fetch-site", "cross-site")
  req.Header.Set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
  req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
​
  //发送请求
  resp, err := client.Do(req)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close()
​
  //获取response,解析数据
  bodyText, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  var response DicResponse
  json.Unmarshal(bodyText, &response)
  fmt.Println(word, "UK:", response.Dictionary.Prons.En, "US:", response.Dictionary.Prons.EnUs)
  for _, x := range response.Dictionary.Explanations {
    fmt.Println(x)
  }
}
​

运行结果如下:

image-20230115161341995.png