golang基础|青训营笔记
对第一次课进行总结
前两节课的内容才看完,之前有稍微听过golang的基础,现在看到还有很多新的收获,特别是再实战阶段,第三个例子自己还需要时间好好的吸收
01简介
主要介绍了go语言的一些特性,主要有:
- 高性能、高并发
- 语法简单
- 丰富的标准库
- 完善的工具链
- 静态连接
- 快速编译
- 跨平台
- 垃圾回收
已经国内的一些厂家也在慢慢的使用go语言
02 入门
这一小节主要讲了golang的开发环境和基本的语法,其实讲的比较浅,能力不够(学过了一次还是得暂停看),我总结一下和其它语言不一样的点
2.1 基础语法 if-else
在语法格式上,if后面的表达式没有括号
2.2 基础语法 swith
每一个case不用写break跳出,会自动跳出
2.3 基础语法 函数
和其它语言很大的一个不同,变量类型是后置的,支持多个返回值
2.4 基础语法 字符串操作
a := "hello"
// 是否包含元素
fmt.Println(strings.Contains(a, "ll")) // true
// 元素计数
fmt.Println(strings.Count(a, "l")) // 2
// 前缀
fmt.Println(strings.HasPrefix(a, "he")) // true
// 后缀
fmt.Println(strings.HasSuffix(a, "llo")) // true
// 元素索引
fmt.Println(strings.Index(a, "ll")) // 2
// 拼接
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
// 重复
fmt.Println(strings.Repeat(a, 2)) // hellohello
// 替换
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
// 分割
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
// 转换为小写
fmt.Println(strings.ToLower(a)) // hello
// 转换为大写
fmt.Println(strings.ToUpper(a)) // HELLO
// 计算长度
fmt.Println(len(a)) // 5
b := "你好"
// 中文占3字节
fmt.Println(len(b)) // 6
03 实战
3.1 猜数字游戏
这个比较简单,感觉每学习一门语言都做过这个小demo
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano()) // 加入随机数种子
intn := rand.Intn(maxNum) // 返回[0,100)的随机整数
//fmt.Printf("the secret number is:%v\n", intn)
fmt.Println("请输入你所猜测的数字:")
reader := bufio.NewReader(os.Stdin) // bufio.NewReader 把一个文件转换成一个 reader 变量
for {
readString, err := reader.ReadString('\n') // 键盘读取输入,直到换行
if err != nil {
fmt.Println("输入有误,请重新输入!")
continue
}
/*
func TrimSuffix(s, suffix string) string
删除s可能的后缀suffix 的字符串
*/
suffix := strings.TrimSuffix(readString, "\r\n") // 删除换行后缀 windows是\r\n
guess, err := strconv.Atoi(suffix) //将字符串转换为int
if err != nil {
fmt.Println("输入有误,请重新输入!")
continue
}
fmt.Println("你所猜的数字是:", guess)
if guess > intn {
fmt.Println("你所猜的数字过大")
continue
} else if guess < intn {
fmt.Println("你所猜的数字过小")
continue
} else {
fmt.Println("恭喜你!!猜对了!!")
break
}
}
}
3.2 简单字典
主要抓住三个点以此来构建:
- 创建请求 http.NewRequest()
- 发送请求 client.Do(req)
- 获取响应 ioutil.ReadAll(resp.Body)
其中构建响应体:JSON转Golang Struct - 在线工具 - OKToolsjson转机结构体
发送请求用逆向工具:Convert curl to Go (curlconverter.com)
代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
// DictRequest 请求体:转换类型、要转换的单词、用户ID
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
// DictResponse 响应体 https://oktools.net/json2go
type DictResponse struct {
Rc int `json:"rc"`
Wiki struct {
KnownInLaguages int `json:"known_in_laguages"`
Description struct {
Source string `json:"source"`
Target interface{} `json:"target"`
} `json:"description"`
ID string `json:"id"`
Item struct {
Source string `json:"source"`
Target string `json:"target"`
} `json:"item"`
ImageURL string `json:"image_url"`
IsSubject string `json:"is_subject"`
Sitelink string `json:"sitelink"`
} `json:"wiki"`
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
Synonym []string `json:"synonym"`
Antonym []string `json:"antonym"`
WqxExample [][]string `json:"wqx_example"`
Entry string `json:"entry"`
Type string `json:"type"`
Related []interface{} `json:"related"`
Source string `json:"source"`
} `json:"dictionary"`
}
// https://curlconverter.com/go/ 根据网址逆向生成,用go发送请求
func query(word string) {
// 创建一个客户端
client := &http.Client{}
// 创建一个请求,word由终端传过来,type写死默认英语转中文
request := DictRequest{TransType: "en2zh", Source: word} // 构建请求体
buf, err := json.Marshal(request) // 将请求序列化
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf) // 把[]byte抽象成Reader
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))
}
// 将响应反序列化成DictResponse
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err)
}
// 打印英标和解释,解释有多种 用for range
fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item)
}
}
func main() {
/*
os.Args获取运行时的参数,是一个切片Slice,第一个值是当前可运行文件的绝对路径
os.Args[0] 就是获取的第一个参数也就是当前路径
go run 后面跟的都是参数
*/
if len(os.Args) != 2 { // 根据输入获取到参数
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
word := os.Args[1]
query(word)
}
例子:
PS D:\Project\Go\doupro> go run main.go marine
marine UK: [məˈriːn] US: [məˈrin]
a.海(产)的;航海的;海事的;船舶用的;海陆军的
n.(总称)船只;舰队;海军;海景画;海景相片
3.3 SOCKS5代理
暂时没有复现
问题:nc命令无法被识别
**解决方式:**安装netcat:Netcat 1.11 for Win32/Win64 (eternallybored.org),安装过程中关闭所有杀毒软件,不然会自动将exe文件删除,windows安全中心->病毒和威胁防护->管理设置->排除项->将解压的文件目录排除,然后把整个目录添加到环境变量中。问题解决
问题:Invoke-WebRequest : 找不到接受实际参数“127.0.0.1:1080”的位置形式参数。
**解决方式:**有一个名为 Invoke-WebRequest 的 CmdLet,其别名为 curl。因此,当您执行此命令时,它会尝试使用 Invoke-WebRequest,而不是使用 curl。删除此别名允许您按预期执行 curl。
执行命令:Remove-item alias:curl 之后再执行命令