GO基础 | 青训营笔记

92 阅读2分钟

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

GO语言

  • 高性能、高并发
  • 语法简单、学习曲线平缓 ↓一个简单的 http 服务器
package main

import{
    "net/http"
}
    
func main(){
    // 在标准库的的http包里内建路由
    http.Handle("/", http.FileServer(http.Dir(".")))
    // 侦听 8080 端口并启动服务器
    http.ListenAndServe(":8080",nil)
}
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
    • 编译结果都静态链接
  • 快速编译
  • 跨平台
    • 交叉编译
  • 垃圾回收

基础语法

// 代表这个文件属于 main 包的一部分
package main

// 导入标准库里的 fmt 包
// 主要用于输出和格式化字符串
import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

编译运行

go run example/01-hello/main.go
go build example/01-hello/main.go
./main

if 条件没有括号, 语句块必须有大括号 switch 不需要括号, 不用加 break 切片: 可变长度数组, 用make创建

s := make([]string, 3)

map: 随机顺序 函数: 可以返回多个值 错误: 用返回值的方式处理, 在返回值类型中加一个 err, 能够知道是哪个函数返回错误

猜数游戏

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.TrimSuffix(input, "\n")
                
                // string -> int
		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
		}
	}
}

命令行词典

访问 fanyi.caiyunapp.com/#/ 右键检查, 输入一个单词后点击翻译, 在 Network 找到 dict, 请求方法为 POST 右键 dict, 选择 copy -> copy as cURL(bash) 访问 curlconverter.com/#go 粘贴后复制得到的 go 代码

package main 
import ( 
        "fmt" 
        "io/ioutil" 
        "log" 
        "net/http"
        "strings" 
) 
func main() { 
        client := &http.Client{} 
        var data = strings.NewReader(`{"trans_type":"en2zh","source":"hello"}`) 
        // 创建请求
        req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) 
        if err != nil { 
            log.Fatal(err) 
        } 
        // 设置请求头
        req.Header.Set("Accept", "application/json, text/plain, */*") 
        req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9") 
        req.Header.Set("Connection", "keep-alive") 
        req.Header.Set("Content-Type", "application/json;charset=UTF-8") 
        req.Header.Set("Origin", "https://fanyi.caiyunapp.com") 
        req.Header.Set("Referer", "https://fanyi.caiyunapp.com/") 
        req.Header.Set("Sec-Fetch-Dest", "empty") 
        req.Header.Set("Sec-Fetch-Mode", "cors") 
        req.Header.Set("Sec-Fetch-Site", "cross-site") 
        req.Header.Set("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Mobile Safari/537.36") 
        req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi") 
        req.Header.Set("app-name", "xy") 
        req.Header.Set("os-type", "web") 
        req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`) 
        req.Header.Set("sec-ch-ua-mobile", "?1") 
        req.Header.Set("sec-ch-ua-platform", `"Android"`) 
        // 发起请求
        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) 
        } 
        fmt.Printf("%s\n", bodyText) }

打开 oktools.net/json2go 生成 json 的对应结构体

SOCKS5 代理服务器

协议都是明文传输 原理: image.png 1&1.1 认证流程 2 请求建立 TCP 连接

package main

import (
	"bufio"
	"log"
	"net"
)

func main() {
	// 侦听一个端口, 返回一个 server
	server, err := net.Listen("tcp", "127.0.0.1:1080")
	if err != nil {
		panic(err)
	}
	// 死循环接受请求
	for {
		client, err := server.Accept()
		if err != nil {
			log.Printf("Accept failed %v", err)
			continue
		}
		// 处理连接
		go process(client)
	}
}

func process(conn net.Conn) {
	// 退出时关闭连接
	defer conn.Close()
	// 只读缓冲流
	reader := bufio.NewReader(conn)
	// for 死循环
	for {
		b, err := reader.ReadByte()
		if err != nil {
			break
		}
		_, err = conn.Write([]byte{b})
		if err != nil {
			break
		}
	}
}