[ 后端DAY1 课程学习笔记 | 青训营笔记 ]

161 阅读3分钟

[ 后端DAY1 课程学习笔记 | 青训营笔记 ]

这是我参与「第五届青训营」伴学笔记创作活动的第1天

前言

着重记录了易混淆以及讲述略过的部分,以及项目复现中部分值得注意的问题。

环境配置

安装问题

选用 vscode+go ,在Visual Studio Code中更新 Go 工具时遇到问题,无法导入所有可用的 go 工具,使用 go mod代理来安装,goproxy.io 是一个国内的代理
cmd 中执行以下代码

# 新版改成如下链接
go env -w GO111MODULE=on
go env -w GOPROXY=https://proxy.golang.com.cn,direct

项目建立问题

对于新项目需要执行 go mod init + 项目名字,该命令初始化并写入一个新的go.mod至当前目录中,实际上是创建一个以当前目录为根的新模块。

go基础语法

字符串连接操作

字符串连接中不含空格

fmt.Println("hello" + "world") //测试时出现过中间出现空格的情况 待解决                  
fmt.Println(strings.Join([]string{"hello", "world"}, "")) //连接符可控

输出操作中含有空格

s := "hello"
n := 123
fmt.Println(s, n) // hello 123

字符串替换操作

字符串操作Replace函数中 最后一个参数的含义

func Replace(s, old, new string, n int) string
// 返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。

示例

a := "hello"
fmt.Println(strings.Replace(a, "e", "E", -1))  

序列化操作

json.MarshalIndent 的参数格式,MarshalIndent 类似于 Marshal,但应用缩进来格式化输出。根据缩进嵌套,输出中的每个 JSON 元素都将在以前缀开头的新行开始,后跟一个或多个缩进副本。

func MarshalIndent(v any, prefix, indent string)([]byte, error)

示例

b, err := json.MarshalIndent(data, "<prefix>", "<indent>")
// output
{
<prefix><indent>"a": 1,
<prefix><indent>"b": 2
<prefix>
}

进程信息

此函数并不能添加或修改 shell 进程的环境变量,或者说通过 setenv 函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了 setenv 函数,进程终止后再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。

fmt.Println(os.Setenv("AA", "BB"))
// 其实nil就是成功了
fmt.Println(os.Getenv("AA"))
fmt.Println(os.Unsetenv("AA"))

// output
<nil>
BB
<nil>

go实战部分

猜数字

在循环猜数字过程中,将输入方式更换为fmt.Scanf("%d", &guess)后,会出现默认输入了两次的情况

You guess is 50
You guess is 50
Your guess is bigger than the secret number. Please try again
You guess is 50
Your guess is bigger than the secret number. Please try again

怀疑输入中的\n也算在内,于是更改Scanf代码如下解决fmt.Scanf("%d \n", &guess)

抓包字典流程概述

  1. 打开翻译网站的开发者模式,找Network的dict请求,分析Payload和Preview

  2. copy as cURL中有cmd和bash,要选择bash

  3. curlconverter.com/go/ cURL -> go 在线工具;转换后的go代码可直接运行

  4. oktools.net/json2go JSON->go 在线工具;不需要详细操作时,使用嵌套模式生成一整个结构体;tips:若quest中json较长也可通过工具生成。

【问题】笔者在搜狗翻译平台进行了尝试,在进行response解析时遇到问题

cannot unmarshal number 16.05 into Go struct field .data.CET4.exam_freq_info.sense_tier_ratio of type int

找到对应的结构体位置,将int改为float64即可。

【问题】进行到v4版本时,没有用户输入的位置

os.Args 是一个存储命令行参数的字符串切片,它的第一个元素是执行文件的名称。

输入如下即可: go run simpledict/self/self_v4/main.go good

原代码如下:

func main() {
	if len(os.Args) != 2 {
		fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
		
example: simpleDict hello //第0个参数 就是main.go本身
		`)
		os.Exit(1)
	}
	word := os.Args[1]
	query(word)
}

socks5代理

  • socks5是明文传输,一些代理协议选择socks5

【问题】 vscode+go 环境下的项目运行会出现问题,关闭vscode默认的powershell,新建command prompt,如下图,同时建立两个cmd,先 go run 运行,再输入命令即可。

image.png

【问题】 在v1版本代码运行中,运行nc命令报错

'nc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
  1. 需要windows下安装 nc(netcat) eternallybored.org/misc/netcat… 下载版本1.12

  2. 会存在拦截情况,可将下载文件夹加入到Windows安全中心>病毒和威胁防护>管理设置>排除项

  3. 解压后的文件夹加入到环境变量或复制nc.exe到cmd默认文件夹下

  4. 需要注意的是,加入到环境变量后要新开一个cmd进行nc命令测试。