青训营笔记第一课

79 阅读3分钟

一、环境配置与安装

  1. 安装go: go.dev/dl/
  2. 安装Visual Studio Code
  3. 在VS里面安装Go扩展,搜索Go扩展安装
  4. 配置环境变量,在本地终端输入这两行命令
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
  1. 在VS中,使用快捷键(ctrl+shift+p),打开命令面板,Go: Install/Update tools搜索 将所有的Go工具都选中安装。
  2. 新建一个main.go文件,写如下代码:
package main

import "fmt"

func main() {
    name := "Go Developers"
    fmt.Println("Azure for", name)
}
  1. 使用go mod init sample-app初始化go应用
  2. 启动调试,f5退出调试

二、Go语言基础

示例代码


package main

import "fmt"

func main() {
    name := "Go Developers"
    fmt.Println("Azure for", name)
}

if-else

    if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

if 后面没有括号

错误处理

package main

import (
	"fmt"
	"errors"
)

type user struct {
	name string
	password string
}

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")
}
func main() {
    // 
	u, err := findUser([]user{{"wang", "1024"}}, "wng")
    // 使用错误处理后,大部分情况下err都是nil,如果不是nil的话那就需要对错误进行处理
	if err != nil {
		fmt.Println(err)
		return
	}
    // 如果上面一步有错误,这里将不会打印出来任何值
	fmt.Println(u.name)

}

占位符

占位符说明举例输出
%v相应值的默认格式Print("%v",people){zhangsan}
%+v打印结构体时,会添加字段名Print("%+v",people{Name:zhangsan}
%#v相应的Go语法表示Print("%#v",peoplemain.Human{Name:"zhangsan"}

小游戏入门

猜谜游戏

用时间戳来初始化随机数种子

rand.Seed(time.Now().Local().UnixNano())

将输入数字转换为整型

有如下需要注意的点,将终端输入转换为整数的时候要根据错误原因来选择去掉什么样的换行符,例如打印出来的错误 strconv.Atoi: parsing "12\r": invalid syntax

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)   //把一个文件转换成一个 reader 变量
	input, err := reader.ReadString('\n') //读取一行
	if err != nil {
		fmt.Println("An error occured while reading input. Please try again", err)
		return
	}
	input = strings.TrimSuffix(input, "\r\n") //  去掉换行符,注意此处具体填什么需要根据第30行的输出决定
 
	guess, err := strconv.Atoi(input) //  将字符串转换成数字
	if err != nil {
		fmt.Println(err) //  根据输出描述中的数字后面的内容,选择第26行中填入\r\n还是\n
		fmt.Println("Invalid input. Please enter an integer value")
		return
	}
	fmt.Println("You guess is", guess)
}

使用fmt.Scanf简化代码

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

两行代码即可完成对终端的读取,并且可以直接读取一个整型

在线词典

自动生成彩云词典的请求

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
	req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) //创建请求
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("authority", "api.interpreter.caiyunai.com") //设置请求
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 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", "47974ad791676bd567ba077edcefaa90")
	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")
	resp, err := client.Do(req) //发送请求
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := io.ReadAll(resp.Body) //运行请求
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}
  1. 生成的程序先创建了一个http客户端,用于向服务器发起请求。
  2. 字符串类型data包含了请求体中的数据
  3. resp, err := client.Do(req)发起一个请求
  4. 请求完成之后使用注册延迟调用的机制,用defer.resp.Body.Close()关闭连接。

如何让请求的数据不再是内置

设置一个字典请求的数据结构

type DictRequest struct {
	TransType string `json:"trans_type"`
	Source    string `json:"source"`
	UserID    string `json:"user_id"`
}