Golang基础 | 青训营笔记

96 阅读2分钟

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

语法基础

  1. 程序入口包必须为main
  2. 变量声明var name type = ,常量根据上下文自动确定类型
  3. if else 必须大括号
  4. for循环和if else一样条件不需要括号
  5. switch { case x : }不需要break
  6. switch { case x : }switch 对象可以任意,甚至不写
  7. 数组var a [5]int 用的少
  8. 切片s := make([]string, 3), 长度可变s = append(s, "d")
  9. map,m := make(map[string]int)
  10. range,类似迭代器,是一种遍历方式
  11. 函数,写法好奇怪
func exists(m map[string]string, k string) (v string, ok bool) {
   v, ok = m[k]
   return v, ok
}
  1. 如果参数列表传递指针,那么能够对原变量进行修改
  2. 结构体
type user struct {
   name     string
   password string
}
func (u user) checkPassword(password string) bool {
   return u.password == password
}

func (u *user) resetPassword(password string) {
   u.password = password
}
  1. 字符串操作与格式化
  2. JSON, 定义一个结构体每个属性以大写字母开头,那么即可序列化。使用json.Marshal(obj)进行序列化,得到一个JSON对象,可以将其转为字符串。Marshal能够进行反序列化。
  3. 时间处理,操作与Java大致上类似。
  4. 字符串与数字间的转换。主要操作位于srconv包中,各种ParseXXX函数。ParseInt三个参数分别为字符串、进制数、返回进制数

猜数字

题目、代码本身都很简单,需要注意的是:Go语言对Linux、mac、Windows的回车换行并没有很好的处理,因此实现的代码需要进行相应改动。 原代码中:

input = strings.TrimSuffix(input, "\n")

需要修改为:

input = strings.TrimSuffix(input, "\r\n")

使用Scanf之后需要使用:

   var guess int
   _, err := fmt.Scanf("%d\r\n", &guess)
package main

import (
   "fmt"
   "math/rand"
   "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")
   for {
      var guess int
      _, err := fmt.Scanf("%d\r\n", &guess)

      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
      }
   }
}

在线词典

题目很有意思,学会了一些工具。Go发HTTP请求感觉挺容易的。 两个工具网站:

https://curlconverter.com/#go
https://oktools.net/json2go

第一个对Edge支持不好。 第三题需要使用Go的协程和WaitGroup实现并发

func main() {
   if len(os.Args) != 2 {
      fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
      `)
      os.Exit(1)
   }
   word := os.Args[1]
   var wg sync.WaitGroup
   wg.Add(2)
   go func() {
      defer wg.Done()
      queryCaiyun(word)
   }()
   go func() {
      defer wg.Done()
      queryBaidu(word)
   }()
   wg.Wait()
   //fmt.Println("以下是彩云")
   //queryCaiyun(word)
   //fmt.Println("--------------------------------------")
   //fmt.Println("以下是百度")
   //queryBaidu(word)
}

最终代码如下: image.png