这是我参与「第三届青训营 -后端场」笔记创作活动的的第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 代理服务器
协议都是明文传输
原理:
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
}
}
}