后端go语言Day1笔记及作业|青训营笔记

105 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。 今天主要学习了Go语言课程的第一节和第二节。

一、本堂课重点内容:

  • go语言的开发环境搭建
  • go语言的基础语法
  • go的简单实战案例--猜数游戏、网络辞典、SOCKS5简单服务搭建

二、详细知识点介绍:

  • 本堂课介绍了哪些知识点?

    • 使用fmt进行基本输出
    import (
    "fmt"
        )
    func main() {
    fmt.Println("hello world")
        }
    

    熟悉任何一门语言,首先要学会其基本的输出。go常用fmt工具包进行基本输出,可以进行格式化输出和,也可以输出后换行。

    • 变量的定义 var关键字 :=自动推断

      变量的定义尝尝可以自动推断,如a:=1var a int =1

      go语言的变量定义后必须使用否则报错

    • go语言的结构控制 for if switch关键字

      go语言没有while关键字,可以用for{}来实现,for后紧跟着条件则与普通用法一致,否则代表死循环。

      if条件语法简洁,没有圆括号,else要紧跟上一个if的花括号后面。

    • 三种常用数据结构 array、slice、map

      array生成后大小不可变(go是静态强类型语言)

      slice可变大小(类似c++ vector)可以用make底层创建一个数组,对外不可见,所以不可以直接操作这个数组,要通过slice去间接的访问各个元素,不可以直接对数组进行维护/操作。

      map是Go语言中内置的一种类型,它将键值对相关联,我们可以通过键key来获取对应的值value。 类似其它语言的HashTable、set

    • 遍历数组 for range

      for key, val := range coll { ... }

      其中coll是array、slice、map一类

    • 函数的定义 func

      驼峰命名

      func 函数名(形参列表)(返回值类型列表){

            执行语句..

            return + 返回值列表

      }

      函数不支持重载

      Golang中支持可变参数

      在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。

      函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用

    • 指针类型

      *声明指针

      &取地址

    • 结构体与常用的结构体操作

      名字大写可以从外部访问 json可以附加小写名

    • 错误控制 errors库

      引入机制:defer+recover机制处理错误 可以new一个error

    • json操作

      json.Marshal()
      json.Unmarshal()转换字符与json
      
    • time操作

      time.Now()

      now.Year()

      now.Month()

      now.Day()

    • 字符串操作

      atoi itoa

      strings.Contains("javaandgolang", "go")

      strings.Count("javaandgolang","a")

      strings.EqualFold("go" , "Go")

      strings.lndex("javaandgolang" , "a")

      strings.Replace("goandjavagogo", "go", "golang", n)

      strings.Split("go-python-java", "-")

      strings.ToLower("Go")

      strings.ToUpper"go")

      strings.TrimSpace(" go and java ")

      strings.Trim("golang ", " ~")

      strings.HasPrefix("java.sun.com/jsp/jstl/fm…", "http")

      strings.HasSuffix("demo.png", ".png")

    • goenv以及命令行传递参数

      os.Args
      os.Getenv("PATH")
      os.Setenv("AA", "BB")
      

三、实践练习例子:

  • curlconverter.com/go/ 这个网站可以讲curl请求转换成go的请求。
  • [JSON转Golang Struct - 在线工具 - OKTools]这个网站可以将json格式的数据转换成go语言的结构体。

1.修改第一个例子里的最终代码,使用fmt.scanf实现

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")
   var guess int
   for {
      fmt.Scanf("%d", &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
      }
   }
}

2.课后第二题,添加一个搜索引擎 使用百度引擎。

image.png

根据这个页面,按照课上步骤进行爬取即可得到结果

image.png

3.课后第三题 可以使用 goroutine 和 channel 来实现同时请求两个网站并在一个请求完成时结束另一个函数。

首先,可以在两个函数中分别开启一个 goroutine,这样就可以同时请求两个网站。然后,可以在两个函数中分别创建一个 channel,用来通信请求是否完成。最后,在主函数中使用 select 语句监听两个 channel,当一个 channel 中有数据时,说明对应的请求已经完成,此时就可以结束另一个函数。

func main() {
   var word string
   done1 := make(chan bool)
   done2 := make(chan bool)
   fmt.Scanf("%s", &word)
   go query_bd(word, done1)
   go query(word, done2)
   select {
   case <-done1:
      fmt.Println("baidu done")
      break
   case <-done2:
      fmt.Println("caiyun done")
      break
   }
   //PS:分别在两个请求函数内部添加了done<-true的语句
}

测试

image.png

//在彩云的请求里添加后测试
time.Sleep(time.Second*5)

image.png 测试结果是彩云比百度快!

四、课后个人总结:

  • 我本节课的socks5那个案例学的不好,需要多实践几次加深理解。