Go语言基础语法 | 青训营笔记

298 阅读5分钟

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

本节课重点内容

1、Go语言背景及特点

2、Go语言开发环境/基础语法/标准库

3、实战项目练习

详细知识点介绍

一、Go语言背景及特点

Go语言是Google于2009年正式推出的一种开源编程语言,它非常适合于分布式系统、网络编程和大型项目开发。 Go语言支持多种基本数据类型,如整数、浮点数、布尔值和字符串。它还支持复合数据类型,如数组、切片和结构体。控制结构包括if语句、for循环和switch语句。Go语言也支持函数和方法,函数可以有多个返回值。
Go语言还支持错误处理和异常处理。异常处理通过defer、panic和recover函数来实现。
Go语言支持并发编程,通过goroutine和channel实现。这些工具可以让开发者在多核环境中实现高效并发程序。
总之,Go语言是一种非常简单易用的编程语言,它为分布式系统、网络编程和大型项目开发提供了优秀的支持。

Go语言的特点:

1673790913413.jpg

二、Go语言开发环境/基础语法/标准库

1. Go语言开发环境配置

安装Golang;

配置开发Golang的编辑器或IDE,可以选择VSCode或Goland。

或选择使用gitpods.IO调试程序

2. Go语言基本语法
  1. package main -> 表示这个文件为main包的一部分

import() -> 导入标准库中的包

  1. var a = "Hello World" / a := "Hello World" -> 声明变量的两种方式

  2. if a == 0 {fmt.Println("Hello World")} -> if else语句,if后的条件无括号,但后面必须接大括号

  3. for i := 0; i < 5; i++{fmt.Println(a)} -> Go中无while、do while循环,只有for循环

  4. swith i{case 1: fmt.Println("one")} -> Go的switch语句不需要加break,且可以使用任意变量类型

  5. var num [5]int -> Go中数组的长度为固定的,因此较少使用

  6. s := make([]string, 3); s = append(s, "H", "e"); fmt.Println(s[1:3]) -> Go使用make创建切片,切片可以任意更改长度,可以使用apped追加元素,拥有与python类似的切片操作

  7. m := make(map[string]int) -> Go创建map,且Go的map为无序的

nums := []int{2, 3, 4}
sum := 0
for i, num := range nums { //遍历数组时,返回索引与对应值
	sum += num
	if num == 2 {
		fmt.Println("index:", i, "num:", num) // index: 0 num: 2
	}
}
fmt.Println(sum) // 9

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //遍历map时,返回k-v对
	fmt.Println(k, v) // b 8; a A
}
for k := range m {
	fmt.Println("key", k) // key a; key b
}

-> Go使用range进行快速遍历

  1. func add(a int, b int)int {return a + b} -> Go创建函数,需注意变量类型为后置

  2. Go的指针与结构体均与C类似,但指针可实现的功能更少;Go可以为结构体定义方法,类似Java中的成员方法

func findUser(users []user, name string) (v *user, err error) {
	for _, u := range users {
		if u.name == name {
			return &u, nil
		}
	}
	return nil, errors.New("not found")
}

-> Go的错误处理与Java的异常不同,通常使用一个单独的返回值来传递错误信息,因此可以清晰的知道哪个函数返回了错误,并可以使用if else进行处理

  1. Go的字符串操作需使用标准库Strings包中的字符串工具函数

  2. Go可以使用%v打印任意类型的变量,%+v打印详细结果,%#v则更详细

  3. Go语言的JSON处理:对于一个现有的结构体只需要将结构体的每一个成员首字母大写,也就是是公开字段,那么就可使用json.Marshal方法对其进行序列化。同时我们也可以对一个序列化后的字符串使用json.Unmarshal进行反序列化到一个空的变量中

3. 实战项目练习
  1. 猜谜游戏
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.Trim(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
      }
   }
}

2.在线词典

代码主体部分:

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

3.socks5服务器

对于该知识点尚未完全掌握,留待以后补充。

本章学习总结

  1. 对于socks5服务器相关内容未掌握,需在课下查找相关资料进一步学习。

  2. 对Go语言的运用还不是很熟练,要在课后继续熟悉Go语言的使用。