GO基本语法与实战案例 | 青训营笔记

126 阅读4分钟

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

本文记录的是第一天上课时录播视频中遇到的不会的知识点,并不会一贯地按着ppt来罗列一些知识点,仅仅代表我个人的一些观点与看法,欢迎各位大佬指点问题。

1.关于Go的简介

1.1 什么是Go语言

image.png

1.2 ByteDance为什么选择了Golang

image.png

2.关于Go的语法

2.1 变量

在Go语言里面有两种声变量的方式

  • var+变量名字+(数据类型,可无)=valuevar + 变量名字 + (数据类型,可无) = value
  • 变量名 := value

2.2 有关条件以及循环语句

  • Golang中没有while 在go语言中,while不是关键字,可以用for语句加break实现while循环
  • 对于if-else 后面的条件不需要加括号,以及大括号{ }的第一个{需要与if 或者else 在同一行,否则会编译错误
  • for这个关键字用的时候也是不需要加括号,其他类似c++ java
  • for {} 这样可以表示无限循环,需要加break来退出循环
  • switch 也不用加括号,可以不加任何条件,直接到对应的语句去判断条件

2.3 常用数据结构

  • 数组,长度固定且在内存连续分配
  • 切片,需要用make关键字来创建
  • map与java,c++类似
  • 用range来遍历数据时,需要两个值进行循环一个索引,一个值 image.png

2.4函数

要注意Golang里面函数传参是值传递,所以在多数情况下参数需要带&或者指针类型*

2.5结构体

  • 下面的demo 理清所有用法

image.png

  • 结构体中的方法有点类似java类中的方法
  • 在实现结构体的方法时,有两种,一种是通过指针指向原来结构体的内存,这种可以改变结构体内的值,一种是直接用结构体名字,这种不能改变结构体内的值,实质是对原来结构体的拷贝

image.png

2.6错误处理

image.png

  • 在Golang里面能很清晰地知道哪个函数返回了错误,并且能够用简单的if-else来判断错误
  • 在写函数返回时,则需要返回两个值,一个是原函数结果+error 如果原来函数没有错误,正常返回,否则,返回error = nil 表示空

2.7字符串操作

image.png

image.png

2.8时间处理

image.png

2.9 处理JSON

image.png

3 实战

3.1猜数

随机数需要加seed,seed里参数可以用时间戳来,否则每次随机都是相同的数

image.png

3.2英语翻译

我在下面代码都加了注释 方便理解

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http" //http包 用来发送请求以及接受响应
	"os"
)

type DictRequest struct { //自定义一个与json数据相对应的结构体 只有前两个字段有用
	TransType string `json:"trans_type"`
	Source    string `json:"source"`
	UserID    string `json:"user_id"`
}

type DictResponse struct { //在解析response body时,用的一个代码生成网站,来生成的结构体 https://oktools.net/json2go
	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"`
}

func query(word string) {
	client := &http.Client{}
	request := DictRequest{TransType: "zh2en", Source: word}
	buf, err := json.Marshal(request) //将结构体进行json序列化 并且这边会返回error异常 需要进行判断 返回的值为一个byte数组
	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) //json反序列化为结构体
	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)
	}
}

func main() {
	if len(os.Args) != 2 { //如果输入的内容不是仅仅为一个单词 这里是2是因为系统会自带传一个参数  os.Args的第一个元素,os.Args, 是命令本身的名字
		fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
		`)
		os.Exit(1)
	}
	word := os.Args[1]
	query(word)
}

想说基本上注释都有了

3.3sock5代理服务器

好难,大部分内容没怎么看懂,水了........ 最后就运行了下老师给的源代码,发现要在cmd窗口下运行才可以,在powershell中会报错

好吧就这样 第一次码笔记,慢慢来坚持吧!!!