实践记录(基础语法和常用特性解析)-LEC1-走进 Go 语言基础语法 | 青训营

145 阅读2分钟

走进 Go 语言基础语法

课程源码:wangkechun/go-by-example (github.com)

全面拥抱Go

配置环境

下个官网的包

然后装个VSCode插件,结果发现没法跑

估计是没配置代理,导致国内访问偏慢的问题

参考goproxy.cn/,使用方法如下:

Go 1.13 及以上(推荐)

打开你的终端并执行

$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct

完成。

macOS 或 Linux

打开你的终端并执行

$ export GO111MODULE=on
$ export GOPROXY=https://goproxy.cn

或者

$ echo "export GO111MODULE=on" >> ~/.profile
$ echo "export GOPROXY=https://goproxy.cn" >> ~/.profile
$ source ~/.profile

完成。

Windows

打开你的 PowerShell 并执行

C:> $env:GO111MODULE = "on"
C:> $env:GOPROXY = "https://goproxy.cn"

Package main报错及解决

只需要go mod init + 项目名即可,如果是使用golang就更方便了,初始构建项目就会有go.mod了

插播:记录下PowerShell临时缩短

 Function Prompt { "$( ( get-item $pwd ).Name )>" }

Hello World成功

go run .\examples\01-hello\main.go

基础语法

if分支

{ 后面不能跟东西,这是与C等语言的不同

其次是有些短变量声明可以和条件写在同一行

 if num := 9; num < 0 {
         fmt.Println(num, "is negative")
     } else if num < 10 {
         fmt.Println(num, "has 1 digit")
     } else {
         fmt.Println(num, "has multiple digits")
     }
 }

在Go语言中,、:=" 运算符可以用于声明和初始化一个新的变量。它的使用场景通常是在需 要在条件语句中声明变量,并将其赋值为-一个特定的初始值。 在你提供的代码中,"b := 9"出现在、 if'语句的条件部分。这是因为在Go语言中,条件部 分可以包含短变量声明。这意味着你可以在条件语句中声明新的变量,并将其作为条件的一 部分进行判断。 在这个例子中,"b := 9的作用是声明并初始化一个新的变量、b",并将其赋值为9。然 后,该变量可以在条件语句的判断中使用。 这种语法设计的目的是为了简化代码并提高可读性。通过将变量的声明和初始化放在条件语 句中,可以更清晰地表达变量的作用范围,并且代码更加紧凑。

switch

功能更加强大,完全可以替代if else(使用无条件的switch

 switch {
     case t.Hour() < 12:
         fmt.Println("It's before noon")
     default:
         fmt.Println("It's after noon")
     }

免去写break,同时switch a,a的类型可更加丰富,比如结构体等

切片:更常用

比较重要

注意append的用法

 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     s := make([]string, 3)
     s[0] = "a"
     s[1] = "b"
     s[2] = "c"
     fmt.Println("get:", s[2])   // c
     fmt.Println("len:", len(s)) // 3
 ​
     s = append(s, "d")
     s = append(s, "e", "f")
     fmt.Println(s) // [a b c d e f]
 ​
     c := make([]string, len(s))
     copy(c, s)
     fmt.Println(c) // [a b c d e f]
 ​
     fmt.Println(s[2:5]) // [c d e]
     fmt.Println(s[:5])  // [a b c d e]
     fmt.Println(s[2:])  // [c d e f]
 ​
     good := []string{"g", "o", "o", "d"}
     fmt.Println(good) // [g o o d]
 }
 ​

关于append,涉及到扩容的问题,所以要返回,使用s = append(s, "e")

Go语言的实战案例

Go 语言的实战案例 - 掘金

case2-simpledict

抓包

彩云小译 - 在线翻译 (caiyunapp.com)

负载Payload就是请求体

响应是Unicode,在预览里面就能看到正常的中文

代码生成

先右键请求,copy as cURL(bash?)

Convert curl to Go (curlconverter.com)

defer关键字

defer 后面跟着的是一个函数调用,该函数会在包含defer语句的函数返回之前被调用。这意味着,当函数的执行进入到 defer 语句时,并不会立即执行这个函数调用,而是先将它压入一个栈(defer栈)。当函数执行完毕,即将要返回时,会从栈中依次取出并执行 defer 的函数调用。

所以先进后出,同一个函数中,在前的defer后执行

关于json.Marshal

那为什么返回的不是字符串而是byte数组?

在Go语言中,json. Marshal函数返回的确实是字节切片(byte数组) ,而不是字符串。这 是因为JSON格式的数据实际上是由字节组成的,而不是直接的字符串类型。在Go语言中,使 用[]byte类型来表示字节切片,因此json. Marshal将数据序列化为字节切片,以便于在 网络传输、文件存储等场景中使用。

json转Golang Struct

JSON转Golang Struct - 在线工具 - OKTools

自己写了个获取天气的实践

shengyuand/lec1-try (gitee.com)

由于网站防范比较弱,基本就是发起get请求罢了,客户端都没创建,参数也没加

case3-Socks5 代理

Socks5(SOCKet Secure version 5)是一种网络协议,它的主要作用是提供网络代理服务。通过Socks5协议,客户端可以向代理服务器发送网络请求,然后由代理服务器代表客户端与其他目标服务器进行通信。

但没法用来fq,因为是明文传输的。主要就是用在一些防火墙设置严格导致内部即使是管理员也访问困难的情境下可以直接

Socks5代理原理