这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。
本节课重点内容
1、Go语言背景及特点
2、Go语言开发环境/基础语法/标准库
3、实战项目练习
详细知识点介绍
一、Go语言背景及特点
Go语言是Google于2009年正式推出的一种开源编程语言,它非常适合于分布式系统、网络编程和大型项目开发。
Go语言支持多种基本数据类型,如整数、浮点数、布尔值和字符串。它还支持复合数据类型,如数组、切片和结构体。控制结构包括if语句、for循环和switch语句。Go语言也支持函数和方法,函数可以有多个返回值。
Go语言还支持错误处理和异常处理。异常处理通过defer、panic和recover函数来实现。
Go语言支持并发编程,通过goroutine和channel实现。这些工具可以让开发者在多核环境中实现高效并发程序。
总之,Go语言是一种非常简单易用的编程语言,它为分布式系统、网络编程和大型项目开发提供了优秀的支持。
Go语言的特点:
二、Go语言开发环境/基础语法/标准库
1. Go语言开发环境配置
安装Golang;
配置开发Golang的编辑器或IDE,可以选择VSCode或Goland。
或选择使用gitpods.IO调试程序
2. Go语言基本语法
package main-> 表示这个文件为main包的一部分
import() -> 导入标准库中的包
-
var a = "Hello World" / a := "Hello World"-> 声明变量的两种方式 -
if a == 0 {fmt.Println("Hello World")}-> if else语句,if后的条件无括号,但后面必须接大括号 -
for i := 0; i < 5; i++{fmt.Println(a)}-> Go中无while、do while循环,只有for循环 -
swith i{case 1: fmt.Println("one")}-> Go的switch语句不需要加break,且可以使用任意变量类型 -
var num [5]int-> Go中数组的长度为固定的,因此较少使用 -
s := make([]string, 3); s = append(s, "H", "e"); fmt.Println(s[1:3])-> Go使用make创建切片,切片可以任意更改长度,可以使用apped追加元素,拥有与python类似的切片操作 -
m := make(map[string]int)-> Go创建map,且Go的map为无序的
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums { //遍历数组时,返回索引与对应值
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //遍历map时,返回k-v对
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
-> Go使用range进行快速遍历
-
func add(a int, b int)int {return a + b}-> Go创建函数,需注意变量类型为后置 -
Go的指针与结构体均与C类似,但指针可实现的功能更少;Go可以为结构体定义方法,类似Java中的成员方法
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
-> Go的错误处理与Java的异常不同,通常使用一个单独的返回值来传递错误信息,因此可以清晰的知道哪个函数返回了错误,并可以使用if else进行处理
-
Go的字符串操作需使用标准库Strings包中的字符串工具函数
-
Go可以使用
%v打印任意类型的变量,%+v打印详细结果,%#v则更详细 -
Go语言的JSON处理:对于一个现有的结构体只需要将结构体的每一个成员首字母大写,也就是是公开字段,那么就可使用
json.Marshal方法对其进行序列化。同时我们也可以对一个序列化后的字符串使用json.Unmarshal进行反序列化到一个空的变量中
3. 实战项目练习
- 猜谜游戏
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
2.在线词典
代码主体部分:
func query(word string) {
client := &http.Client{}
request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
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))
}
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err)
}
fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item)
}
}
3.socks5服务器
对于该知识点尚未完全掌握,留待以后补充。
本章学习总结
-
对于socks5服务器相关内容未掌握,需在课下查找相关资料进一步学习。
-
对Go语言的运用还不是很熟练,要在课后继续熟悉Go语言的使用。