GO语言上手——基础语言(王克纯)|青训营笔记

352 阅读2分钟

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

1. 简介

1.1 什么是Go语言?

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

1.2 谁在使用?

ByteDance(字节跳动)、Tencent(腾讯)、Facebook 、Google……

2. 入门

2.1 开发环境

  1. 安装golang

    go.dev

    studygolang.com/dl

    goproxy.cn/

  2. 配置集成开发环境

2.2 基础语法

2.2.1 Hello World

 package main
 import {
     "fmt"
 }
 ​
 func  mian(){
     fmt.Pritfln("HelloWorld")
 }
 ​

2.2.2 变量类型(go是强类型语言)

int float double string(内置类型)……

  • 变量的声明

    • type name = value
    • name := value

2.2.3 if-else

 if 条件 {
    ****
 }else if 条件{
    ***** 
 }else{
    ****
 }

2.2.4 for

 for{
 ​
 }
 ​
 for j:=0;j<n;++j{
 ​
 }
 ​
 for i<3  {
 ​
 }

2.2.5 switch

 switch a{
     case 1:***
     case 2:***
     case 3:***
     case 4:***
 }

每一个case 语句不加break,默认是执行完立即跳switch,这是与其他语言不同的

 switch{
     case t<12:
     
     default:
     
 }

可代替多重if-else的结构

2.2.6 数组

  1. 定义

    name [size]Type

      var a[5]int
    
  2. 使用

    与其他语言的数组使用方式相似

2.2.7 切片

  1. 定义

    变量 :=make([]type,n)

     s:=make([]string,3)
    
  2. 使用

     s[0]="a"
     s[1]="b"
    
  3. 特点

    类似可以不断扩容的数组

  4. 元素添加

     //[a,b,c]
     s=append(s,"s")
     //[a,b,c,s]
    
  5. 切片

     fmt.printf(s[2:3])//[c,s]
    

2.2.8 map

  1. 定义

    变量名 :=make(map[KeyType]ValueType)

     m:=make(map[string]int)//单纯定义
     m2:=map[string]int{"one":,1,"two":2}//定义赋值
    
  2. 更新

     m["a"]=1
    
  3. 使用

     fmt.printf(m["one"])
     r,ok=m["one"]
     //r:返回值;ok:是否存在信息
    
  4. 删除元素

     delete(m,"one")
    

2.2.9 range

快速遍历

 //数组
 for i,num :=range nums{
     sum+=num
     if num==2{
         fmt.printf("index:",i,"num:",num)
     }
 }
 //map
 for k,v:=range m{
     fmt.Printf("key",k,"value",v);
 }
 for k=range m{
     fmt.Println("key",k);
 }

2.2.10 函数

 package main
 ​
 import "fmt"
 ​
 func add(a int,b int){
     return a+b
 }

2.2.11 指针

功能有限,主要是对值进行修改

 package main
 ​
 import "fmt"
 ​
 func add(n *int){
     n+=1;
     return n;
 }

2.2.12 结构体

带类型的字段的集合

 package main
 ​
 import "fmt"
 ​
 type user struct {
     name     string
     password string
 }
 ​
 func main() {
     a := user{name: "wang", password: "1024"}
     b := user{"wang", "1024"}
     c := user{name: "wang"}
     c.password = "1024"
     var d user
     d.name = "wang"
     d.password = "1024"
     
     fmt.Println(a,b,c,d)
     fmt.Println(checkPassword(a,"hah"))
     fmt.Println(checkPassword2(&a,"hah"))
     
 }
 func checkPassword(u user,password string) bool {
     return u.password==password 
 }
 func checkPassword2(u *user,password string) bool  {
     return u.password==password
 }

2.2.13 结构体方法

类似于其他语言类成员函数

 package main
 ​
 import "fmt"
 ​
 type user struct {
     name     string
     password string
 }
 ​
 func main() {
     a:=user{"wang","1024"}
     fmt.Println(a.checkPassword2("2048"))
     fmt.Println(a.checkPassword("2048"))
 }
 func (u user)checkPassword(password string) bool {
     return u.password==password 
 }
 func (u *user)checkPassword2(password string) bool  {
     return u.password==password
 }

2.2.14 错误处理

 package main
 ​
 import (
     "errors"
     "fmt"
 )
 ​
 type user struct {
     name     string
     password string
 }
 ​
 func findUser(user []user, name string) (y *user, err error) {
     for _, u := range user {
         if u.name == name {
             return &u, nil
         }
     }
     return nil, errors.New("not found")
 }
 func main() {
     u,err :=findUser([]user{{"wang","1024"}},"wang")
     if err != nil {
         fmt.Println(u.name)
         return
     }
     fmt.Println(u.name)
 ​
     if u,err := findUser([]user{{"wang","1024"}},"li");err != nil{
         fmt.Println(err)
         return
     }else{
         fmt.Println(u.name)
     }
 }
 ​

2.2.15 字符串操作

 package main
 ​
 import (
     "fmt"
     "strings"
 )
 ​
 func main() {
     a := "hello"
     fmt.Println(strings.Contains(a, "ll"))  //判断是否包含 true
     fmt.Println(strings.Count(a, "l"))      //字符串计数 2
     fmt.Println(strings.HasPrefix(a, "he")) //
     fmt.Println(strings.HasSuffix(a, "llo"))
     fmt.Println(strings.Index(a, "ll"))                   //查找字符串位置
     fmt.Println(strings.Join([]string{"he", "llo"}, "-")) //sep分割字符串he-llo
     fmt.Println(strings.Repeat(a, 2))                     //hellohello
     fmt.Println(strings.Replace(a, "e", "E", -1))         //hEllo
     fmt.Println(strings.Split("a-b-c", "-"))              //sep拆分字符串 [a b c]
     fmt.Println(strings.ToLower(a))                       //hello
     fmt.Println(strings.ToUpper(a))                       //HELLO
     fmt.Println(len(a))                                   //5
     b := "你好"
     fmt.Println(len(b)) //6
 }
 ​

2.2.16 字符串格式化

 package main
 ​
 import "fmt"
 ​
 type point struct {
    x, y int
 }
 ​
 func main() {
    s := "hello"
    n := 123
    p := point{1, 2}
    fmt.Println(s, n)
    fmt.Println(p)
 ​
    fmt.Printf("s=%v\n", s)
    fmt.Printf("n=%v\n", n)
    fmt.Printf("p=%v\n", p)
    fmt.Printf("p=%+v\n", p)
    fmt.Printf("p=%#v\n", p)
 ​
    f := 3.141592653
    fmt.Println(f)
    fmt.Printf("%.2f\n", f)
 ​
 }
 ​
 ​
 运行结果
 hello 123
 {1 2}
 s=hello
 n=123
 p={1 2}
 p={x:1 y:2}
 p=main.point{x:1, y:2}
 3.141592653
 3.14

2.2.17 JSON处理

 package main
 ​
 import (
     "encoding/json"
     "fmt"
 )
 ​
 type userInfo struct {
     Name  string
     Age   int `json:"age"`
     Hobby []string
 }
 ​
 func main() {
     a := userInfo{"wang", 18, []string{"Goland", "TypeScript"}}
     buf, err := json.Marshal(a) //序列化
     if err != nil {
         panic(err)
     }
     fmt.Println(buf) //打印的是16进制编码
     fmt.Println(string(buf))
     buf, err = json.MarshalIndent(a, "", "\t")
     if err != nil {
         panic(err)
     }
     fmt.Println(buf)
 ​
     var b userInfo
     err = json.Unmarshal(buf, &b)
     if err != nil {
         panic(err)
     }
     fmt.Printf("%#v\n", b)
 }
 ​

2.2.18 时间处理

 package main
 import (
     "fmt"
     "time"
 )
 func main() {
     now := time.Now()
     fmt.Println(now)
     t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
     t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
     fmt.Println(t)
     fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute())
     fmt.Println(t.Format("2006-01-02 15:04:05"))
     diff := t2.Sub(t)
     fmt.Println(diff)
     fmt.Println(diff.Minutes(), diff.Seconds())
     t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
     if err != nil {
         panic(err)
     }
     fmt.Println(t3)
     fmt.Println(now.Unix())
 }
 ​
 //运行结果
 2022-05-10 17:06:58.7885904 +0800 CST m=+0.002621601
 2022-03-27 01:25:36 +0000 UTC
 2022 March 27 1 25
 2022-03-27 01:25:36
 1h5m0s
 65 3900
 2022-03-27 01:25:36 +0000 UTC
 1652173618

2.2.19 数字解析

 package main
 ​
 import (
     "fmt"
     "strconv"
 )
 ​
 func main() {
     f, _ := strconv.ParseFloat("1.234", 64)
     fmt.Println(f)
 ​
     n, _ := strconv.ParseInt("111", 10, 64)
     fmt.Println(n)
 ​
     n1, _ := strconv.ParseInt("0x1000", 0, 64)
     fmt.Println(n1)
 ​
     n2, _ := strconv.Atoi("123")
     fmt.Println(n2)
 ​
     n3, err := strconv.Atoi("AAA")
     fmt.Println(n3, err)
 }
 //运行结果
 1.234
 111
 4096
 123
 0 strconv.Atoi: parsing "AAA": invalid syntax

2.2.20 进程信息

 package main
 ​
 import (
     "fmt"
     "os"
     "os/exec"
 )
 ​
 func main() {
     // go run example/20-env/main.go a b c d
     fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
     fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
     fmt.Println(os.Setenv("AA", "BB"))
 ​
     buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
     if err != nil {
         panic(err)
     }
     fmt.Println(string(buf)) // 127.0.0.1       localhost
 }
 ​

3.实战

3.1 猜数字游戏

 /*V5*/
 package main
 ​
 import (
     "bufio"
     "fmt"
     "math/rand"
     "os"
     "strconv"
     "strings"
     "time"
 )
 ​
 func main() {
     maxNum := 100
     rand.Seed(time.Now().UnixNano())
     secretNumber := rand.Intn(maxNum)
     // fmt.Println("The secret number is ", secretNumber)
 ​
     fmt.Println("Please input your guess")
     reader := bufio.NewReader(os.Stdin)
     for {
         input, err := reader.ReadString('\n')
         if err != nil {
             fmt.Println("An error occured while reading input. Please try again", err)
             continue
         }
         input = strings.TrimSuffix(input, "\r\n")
         guess, err := strconv.Atoi(input)
         if err != nil {
             fmt.Println("Invalid input. Please enter an integer value")
             continue
         }
         fmt.Println("You guess is", guess)
         if guess > secretNumber {
             fmt.Println("Your guess is bigger than the secret number. Please try again")
         } else if guess < secretNumber {
             fmt.Println("Your guess is smaller than the secret number. Please try again")
         } else {
             fmt.Println("Correct, you Legend!")
             break
         }
     }
 }
 ​

3.2 命令行在线词典

代码生成

https://curlconverter.com/#go

json转go

https://oktools.net/json2go

 package main
 ​
 import (
     "bytes"
     "encoding/json"
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
 )
 ​
 type DictRequest struct {
     TransType string `json:"trans_type"`
     Source    string `json:"source"`
     UserID    string `json:"user_id"`
 }
 ​
 type DictResponse 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 query(word string) {
     client := &http.Client{}
     request := DictRequest{TransType: "en2zh", Source: word}
     buf, err := json.Marshal(request)
     if err != nil {
         log.Fatal(err)
     }
     var data = bytes.NewReader(buf)
     req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
     if err != nil {
         log.Fatal(err)
     }
     req.Header.Set("Connection", "keep-alive")
     req.Header.Set("DNT", "1")
     req.Header.Set("os-version", "")
     req.Header.Set("sec-ch-ua-mobile", "?0")
     req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
     req.Header.Set("app-name", "xy")
     req.Header.Set("Content-Type", "application/json;charset=UTF-8")
     req.Header.Set("Accept", "application/json, text/plain, */*")
     req.Header.Set("device-id", "")
     req.Header.Set("os-type", "web")
     req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
     req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
     req.Header.Set("Sec-Fetch-Site", "cross-site")
     req.Header.Set("Sec-Fetch-Mode", "cors")
     req.Header.Set("Sec-Fetch-Dest", "empty")
     req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
     req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
     req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
     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)
     }
     if resp.StatusCode != 200 {
         log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
     }
     var dictResponse DictResponse
     err = json.Unmarshal(bodyText, &dictResponse)
     if err != nil {
         log.Fatal(err)
     }
     fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
     for _, item := range dictResponse.Dictionary.Explanations {
         fmt.Println(item)
     }
 }
 ​
 func main() {
     //  if len(os.Args) != 2 {
     //      fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
     //example: simpleDict hello
     //      `)
     //      os.Exit(1)
     //  }
     //  word := os.Args[1]
     /*这里直接用scanf输入word*/
     var word string
     fmt.Scanf("%v", &word)
     query(word)
 }

\