Golang入门|青训营笔记

117 阅读3分钟

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

1. 基础语法方面

1. Fmt 输出‘+’与‘#’的使用

p := point{1, 2}
fmt.Printf("p= %+v\n", p) // p={x:1 y:2}
fmt.Printf("p= %#v\n", p) // p=main.point{x:1, y:2}

2. Json的处理

a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
err = json.Unmarshal(buf, & b)

3.数字解析与转换

package main
import (
    "fmt"
    "strconv"
)
func main() {
    f, _ := strconv.ParseFloat("1.234", 64)
    fmt.Println(f) // 1.234
    n, _ := strconv.ParseInt("111", 10, 64)
    fmt.Println(n) // 111
    n, _ = strconv.ParseInt("0x1000", 0, 64)
    fmt.Println(n) // 4096
    n2, _ := strconv.Atoi("123") // 字符串转数字
    fmt.Println(n2) // 123
    n2, _ := strconv.Itoa(123) // 数字转字符串
    fmt.Println(n2) // "123"    
    n2, err := strconv.Atoi("AAA")
    fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax
}

4.进程信息

 // go run example/20-env/main.go a b c d
fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
fmt.Println(os.Setenv("AA", "BB"))
//开启子进程 在hosts文件中查找127.0.0.1
buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts")

                                                        .CombinedOutput()
if err != nil {
    panic(err)
}
fmt.Println(string(buf)) // 127.0.0.1       localhost

2. 项目实战方面

1.猜拳游戏

和C差不多, 需要先设定种子seed再进行随机数选取,读取一行数据的方式,还有就是一些错误捕获,主要是用来复习语法方面的知识吧

reader := bufio.NewReader(os.Stdin) //和系统输入进行绑定
input, err := reader.ReadString('\n') //读取一行数据 包括'\n'
input = strings.TrimSuffix(input, "\n") //如果数据以\n结尾,删除'\n'

2.在线词典的实现

Get了一些好用的在线提效工具

1.curlconverter.com

对浏览器请求的,转换为响应语言的请求代码,右键复制为cURL,粘贴到网站中进行代码生成

2.JSON转Golang Struct

1.将负载json转换为结构体

2.将返回json内容转换为结构体

第一个网站用来写响应,但是他提交的内容都是写死的,我没办法输入一个“hello”就查hello,输入“like”就查like,而是在代码中写死了。

第二个网站用来将需要提交的内容提取出来,在代码中添加对应的结构体变量,然后通过捕获命令行的输入来设置变量内容进行查询

此外,当请求响应回来的时候需要提取json中对应的内容,响应直接写入对应的json变量中,提取json结构体变量对应的成员就可以完成解析。

3.SOCKS5

原理

1.  客户端先和代理服务器进行协商,可能需要密码啊之类的

1.1 这里实现的较为简单不需要额外的验证,

2.  之后客户端对Host进行请求都是通过socks5服务器,socks5服务器对客户端的请求进行解析

2.1 与Host建立TCP连接并进行请求

2.2 返回请求到服务器

2.3 服务器写回到客户端

3.作业

作业1

input := ""

fmt.Scan(&input) //读取空格就结束
fmt.Scanf("%s", &input) //完全按照 ""进行读取
fmt.Scanln(&input) //获取一行数据不包括 '\n'

作业2

就比较坑的是有的翻译网站提交的内容是编码过的应该,或者是加密过的?返回的信息也是被修改过的,操作起来不是很方便,文本翻译_机器翻译_在线翻译-有道智云AI开放平台 (youdao.com) 这个的格式比较简单,用表单提交的方式进行post

var data = strings.NewReader(fmt.Sprintf("q= %s&from=Auto&to=Auto", word))

作业3

模仿课程中的context使用

ctx, cancel := context.WithCancel(context.Background())
defer cancel()
 //启动两个goroutine一旦一个执行完成运行cancel
 //main函数收到后就结束了程序
 //这样就实现了谁快谁先输出
go func() {
    queryC(word)
    cancel()
}()

go func() {
    queryY(word)
    cancel()
}()
 <-ctx.Done()