GO语言基础 | 青训营笔记

503 阅读4分钟

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

一、本堂课重点内容:

  • 第一节课,概览了go的基础用法.
  • 第二节课,三个硬核的go例子,不愧是字节

二、详细知识点介绍(第一节课):

*第一节课对于我来说是查漏补缺,复习巩固.有些函数仅列出名字,建议在golang里直接看源码和注释.

  • 安装go,两步

    • 1.下载go
    • 2.下载IDE
      • 配置goproxy(即换源 goproxy.cn)
      • 集成开发环境我选择了goland,但是确实太吃内存,未来考虑换回vscode.
  • 基础语法

    • 变量: go是一种强类型语言,每个变量都有自己的类型.变量的声明有两种方式:

      • 1.关键字声明:

        • (1) 使用var/const可以声明变量和常量;
        • (2) 声明时可以赋初值,如果不赋初值,就是对应变量的0值(int:0,string:"",bool:false...);
        • (3) 赋初值的时候可以不指定类型,也可以指定.
      • 2.':='符号声明:

        • (1) 那么必须要赋值;
        • (2) 确实更加方便.
    • if-else:类似于c的写法,但是不用'( )'包裹条件.

    • for:golang只有for一种循环,同样不需要'( )'包裹条件. 循环条件写法有:

      • 1.不写,就是死循环
      • 2.只写条件,类似于其它语言的while
      • 3.循环变量;条件;更新
      • 4.range关键字:
        • key,value:=range XXX
    • switch:相比于c语言:

      • 1.默认执行完case就跳出,不用加break.
      • 2.如果要不break反而要加关键字.
        • 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true
      • 3.case里可以写完整的条件表达式,而switch为空,所以可以替代if-else.
    • 数组

      • 声明:
        • 法一: var a [4]int
        • 法二: a:=[4]int{1,2,3,4}
    • 切片

      • 声明:
        • make([]type,len,cap)
      • append:在slice后面追加元素
    • map

      • 声明:make(map[key]value)
      • 对于访问未知的key,会返回对应value类型的0值
      • delete(map,keyName) 删除键值对
    • range

      • 语法糖,可以方便的便利slice和map (struct不行!).
      • for i,v:=range XXX{...
    • 函数

      • func funcName(args types)(return){...
      • 函数是go中的一等公民
    • 指针

      • 用法很单一,只能用于传参,不能运算.
    • 结构体

      • 结构体+方法 就是go的"对象"
    • 出错处理

      • if err!=nil{...
    • 字符串操作:在strings包里

      • Contains("Hello","ll") //true
      • Count("Hello",l)//2
      • HasPrefix("Hello","He")//true
      • HasSuffix("Hello","lo")//true
      • Index("Hello","ll")//2
      • Join([]string("He","llo"),"-")//He-llo
      • Repeat("Hello",2)//HelloHello
      • Replace("Hello","l","L",1)//HeLlo
      • Split("a.b.c.d",".")//[a,b,c,d]
      • ToLower("Hello")//hello
      • ToUpper("Hello")//HELLO
    • 格式化:

      • %v 打印值
      • %+v 打印键值
      • %#v 打印类型+键值
    • json:

      • 序列化和反序列化,略
    • 时间: 模板为"1月2日下午3点4分5秒在06年"

      • 常用:
        • 得到时间变量t: time.Now() time.Date(...) time.parse(...)
        • t.Year(),t.Month(),t.Day(),t.Hour(),t.Minute()
        • 得到时间段diff: t.sub(t2)
        • diff.Minutes(),diff.Seconds()
    • 数字解析: 在strconv包里

      • 常用方法: ParseFloat,ParseInt,Atoi
    • 进程信息:

      • 常用方法:os.args,os.getenv,os.setenv,exec.command

三、实践练习例子(第二节课):

  • 1.猜数字
    • 作业一
  • 2.翻译引擎
    • 作业二
    • 作业三
  • 3.socks5代理

作业1

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)

   fmt.Println("Please input your guess")
   for {
      var guess int
      if _, err := fmt.Scanln(&guess); err != nil {
         fmt.Println(err)
         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:复刻一个单词查询,我选择的是江沪英语(实际上就是百度的引擎).然后开两个goroutine,用waitgroup优雅地等待即可.我把两个引擎封装在了两个不同的包里面.代码量太大,我就不展示了,跟着视频一步一步做就行.

func main() {
   if len(os.Args) != 2 {
      fmt.Println("只能输入一个查询词!")
      return
   }
   word := os.Args[1]
   wg := sync.WaitGroup{}
   wg.Add(2)
   go huEngine.HuQuery(word, &wg)
   go caiyunEngine.CaiYunQuery(word, &wg)
   wg.Wait()
}




$go run simpledict/v5/main.go happy
------彩云结果------
happy UK: [ˈhæpi] US: [ˈhæpɪ]
a.快乐的;幸福的;满意的;适当的;得体的;乐意的
------江沪结果------
happy 快乐的

四、课后个人总结:

  • 本章有什么知识点不容易掌握?
    • 第二节课的内容比较难,需要一些基础才能跟上,尤其是第二第三个例子学到了很多新东西.
    • 其次,老师讲课中的工具在我的电脑上有点异常,copy as cURL在我这会有很多'^'的乱码要手动清除.
  • 什么地方容易与其他内容混淆?
    • 暂无.

五、引用参考: