Go基础| 青训营笔记

142 阅读3分钟

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 之后再执行命令