Powered by:NEFU AB-IN
Go 語言的實戰(zhàn)案例 | 青訓營
- GO語言工程實踐課后作業(yè):實現(xiàn)思路、代碼以及路徑記錄
Go補充簡介
在計算機編程領(lǐng)域,Go 語言(也稱為 Golang)正逐漸成為越來越受歡迎的選擇。它是一門由 Google 開發(fā)的開源編程語言,以其簡潔性、高效性和強大的并發(fā)支持而聞名。Go 語言的設(shè)計目標是提供一種簡單易學、高效可靠的編程語言,同時具備 面向?qū)ο蠛秃瘮?shù)式編程的特性。
Go 語言的實戰(zhàn)案例是一個很好的方式來了解和掌握這門語言的基礎(chǔ)知識。通過實際的應用場景和案例,我們可以更深入地了解 Go 語言的特點、語法和最佳實踐。下面我將分享一些關(guān)于走進 Go 語言基礎(chǔ)語言的實戰(zhàn)案例的筆記。
并發(fā)編程: Go 語言在并發(fā)編程方面有著獨特的優(yōu)勢。通過 Goroutine 和 Channel 的概念,Go 語言使并發(fā)編程變得簡單且高效。實戰(zhàn)案例中,我們可以通過編寫并發(fā)的網(wǎng)絡(luò)爬蟲、并發(fā)處理大量數(shù)據(jù)等任務來體驗 Goroutine 和 Channel 的強大威力。
Web開發(fā): Go 語言具備強大的網(wǎng)絡(luò)編程能力,因此在 Web 開發(fā)領(lǐng)域也有著廣泛的應用。通過實戰(zhàn)案例,我們可以學習如何使用 Go 語言構(gòu)建高性能的 Web 服務器、RESTful API,以及處理請求和響應等常見任務。
數(shù)據(jù)庫操作: Go 語言提供了豐富的數(shù)據(jù)庫操作庫,如標準庫中的 database/sql 包以及第三方的 ORM 框架。實戰(zhàn)案例中,我們可以學習如何使用 Go 語言與各種數(shù)據(jù)庫進行交互,執(zhí)行查詢、插入和更新等操作,并學習如何優(yōu)化數(shù)據(jù)庫操作的性能。
文件處理和系統(tǒng)編程: Go 語言對于文件處理和系統(tǒng)編程也有著良好的支持。實戰(zhàn)案例可以涵蓋文件的讀寫、目錄的遍歷、系統(tǒng)命令的執(zhí)行等方面。這些案例將幫助我們理解 Go 語言在操作系統(tǒng)級別編程時的優(yōu)勢和技巧。
測試和性能優(yōu)化: Go 語言注重代碼質(zhì)量和性能,因此在實戰(zhàn)案例中,測試和性能優(yōu)化也是不可或缺的內(nèi)容。我們可以學習如何編寫單元測試和集成測試,并使用性能分析工具來發(fā)現(xiàn)和改進代碼中的性能瓶頸。
平臺和工具開發(fā): Go 語言本身就是一個非常強大的工具和平臺開發(fā)語言。實戰(zhàn)案例可以涵蓋開發(fā)各種工具、命令行應用、服務器軟件等。我們可以學習如何使用 Go 語言構(gòu)建高效的命令行工具、自定義 HTTP 服務器、消息隊列等應用。
跨平臺開發(fā): Go 語言支持跨平臺編譯,這使得我們可以輕松地在不同操作系統(tǒng)上構(gòu)建和部署應用程序。通過實戰(zhàn)案例,我們可以學習如何使用 Go 語言開發(fā)跨平臺應用,為不同操作系統(tǒng)編譯和交付可執(zhí)行文件。
微服務和分布式系統(tǒng): 微服務和分布式系統(tǒng)是現(xiàn)代軟件開發(fā)中的熱門話題。Go 語言在構(gòu)建微服務和分布式系統(tǒng)方面具有優(yōu)勢,因為它提供了輕量級的協(xié)程和高效的網(wǎng)絡(luò)庫。實戰(zhàn)案例可以涵蓋服務間通信、負載均衡、服務發(fā)現(xiàn)等方面,幫助我們理解和應用微服務架構(gòu)和分布式系統(tǒng)的概念。
通過以上的實戰(zhàn)案例,我們可以全面掌握 Go 語言的基礎(chǔ)語言特性,并了解如何在實際項目中應用它們。同時,實戰(zhàn)案例也能幫助我們熟悉和理解 Go 語言的開發(fā)流程、工具鏈以及最佳實踐。
總結(jié)起來,走進 Go 語言基礎(chǔ)語言的實戰(zhàn)案例是學習和掌握這門語言的重要途徑之一。通過實際的應用場景和案例,我們可以深入理解 Go 語言的特點和優(yōu)勢,掌握其核心語法和常用庫的使用。
猜數(shù)游戲
由于邏輯過于簡單,在此不再贅述
知識點
-
包管理和導入:在 Go 語言中使用
import
來導入所需的包,比如fmt
、math/rand
、os
等。 -
隨機數(shù)生成:使用
math/rand
包的rand.Seed()
和rand.Intn()
函數(shù)來生成隨機整數(shù)。 -
時間處理:使用
time
包獲取當前時間的納秒級表示,用于初始化隨機數(shù)生成器的種子值。 -
用戶輸入輸出:使用
bufio
包的bufio.NewReader()
和ReadString()
函數(shù)來讀取用戶輸入(即讀取一行),并使用fmt
包的Println()
函數(shù)來打印輸出。 -
字符串處理:使用
strings
包的Trim()
函數(shù)來處理輸入中的結(jié)尾換行符。 -
類型轉(zhuǎn)換:使用
strconv
包的Atoi()
函數(shù)將字符串轉(zhuǎn)換成整數(shù)。 -
循環(huán):使用
for { ... }
來創(chuàng)建一個無限循環(huán),使得游戲可以持續(xù)進行,直到玩家猜對為止。 -
條件語句:使用
if
和else if
來根據(jù)玩家猜測和秘密數(shù)字的比較結(jié)果給出相應的提示。
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"time"
)
var (
in = bufio.NewReader(os.Stdin)
out = bufio.NewWriter(os.Stdout)
)
func Read[T any]() T {
var i T
fmt.Fscan(in, &i)
return i
}
func main() {
defer out.Flush()
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)
guess := Read[int]()
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
}
}
}
結(jié)果截圖
在線詞典項目
-
fanyi.caiyunapp.com/
-
-
點擊payload和preview
Payload是數(shù)據(jù)包中實際傳輸?shù)臄?shù)據(jù)內(nèi)容,而Preview是對Payload的一個預覽或摘要,用于快速了解數(shù)據(jù)包的內(nèi)容。Payload是數(shù)據(jù)的實體,而Preview則是展示給用戶的一個概括或摘要。
-
采用wireshark也可實現(xiàn)抓包
-
請求復制 (目的是為了用go來模擬發(fā)送相同的請求)
-
將請求復制為cURL(bash)是指將一個HTTP請求的參數(shù)、請求頭和URL等信息,以curl命令的形式拷貝到終端中。
-
復制生成的代碼就是拷貝得到的curl命令,它可以在命令行中直接執(zhí)行,發(fā)送與拷貝的請求相同的HTTP請求。
-
在給定的示例中,這段代碼表示一個發(fā)送到 https://api.interpreter.caiyunai.com/v1/dict 的HTTP POST請求。請求頭包含多個參數(shù),如authority、accept、accept-language等。請求體中的JSON數(shù)據(jù)為"trans_type":“en2zh"和"source”:“good”。
-
使用復制生成的代碼,你可以在終端中直接執(zhí)行該命令,從而發(fā)送相同的HTTP請求,并獲取該請求的響應結(jié)果。
-
Curl是一個用于發(fā)送和接收HTTP請求的命令行工具。它支持多種協(xié)議,包括HTTP、HTTPS、FTP、SMTP等,并提供了許多可配置的選項和參數(shù),使用戶可以根據(jù)需要定制和控制HTTP請求的各個方面。Curl可以通過命令行界面直接執(zhí)行,也可以與腳本語言(如bash、Python等)一起使用,從而方便地集成到各種開發(fā)和測試場景中。Curl常用于測試和調(diào)試Web應用程序,以及進行API接口的測試和集成。
curl 'https://api.interpreter.caiyunai.com/v1/dict' \ -H 'authority: api.interpreter.caiyunai.com' \ -H 'accept: application/json, text/plain, */*' \ -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \ -H 'app-name: xy' \ -H 'content-type: application/json;charset=UTF-8' \ -H 'device-id: 313abb19c54ae93fa733afae2f9fca47' \ -H 'origin: https://fanyi.caiyunapp.com' \ -H 'os-type: web' \ -H 'os-version;' \ -H 'referer: https://fanyi.caiyunapp.com/' \ -H 'sec-ch-ua: "Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"' \ -H 'sec-ch-ua-mobile: ?0' \ -H 'sec-ch-ua-platform: "Windows"' \ -H 'sec-fetch-dest: empty' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-site: cross-site' \ -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203' \ -H 'x-authorization: token:qgemv4jr1y38jyq6vhvi' \ --data-raw '{"trans_type":"en2zh","source":"good"}' \ --compressed
-
-
代碼生成器 Convert curl to Go (curlconverter.com)
將curl請求生成go代碼
strings.NewReader是一個函數(shù),它返回一個實現(xiàn)io.Reader接口的類型strings.Reader。strings.Reader可以用來讀取一個字符串的內(nèi)容。
io.Reader是一個接口,它定義了一個用于讀取數(shù)據(jù)的方法Read。任何實現(xiàn)了Read方法的類型都可以被稱為io.Reader。這個接口常用于讀取輸入流的數(shù)據(jù),如文件、網(wǎng)絡(luò)連接、字節(jié)數(shù)組等。通過實現(xiàn)io.Reader接口,可以方便地進行讀取操作,比如逐行讀取文件內(nèi)容或按照指定大小讀取數(shù)據(jù)塊。
-
補充說明
接收一個 io.Reader 類型的參數(shù),可以傳入 os.Stdin,因為 os.Stdin 實現(xiàn)了 io.Reader 接口。
在Go語言中,io.Reader 是一個接口,它定義了一個讀取數(shù)據(jù)的方法 Read。任何實現(xiàn)了 Read 方法的類型都可以被視為 io.Reader 類型。
os.Stdin 是一個 os.File 類型的值,而 os.File 類型實現(xiàn)了 Read 方法,因此它也被視為實現(xiàn)了 io.Reader 接口。
/* * @Author: NEFU AB-IN * @Date: 2023-08-23 10:35:07 * @FilePath: \GoTest\5\5.go * @LastEditTime: 2023-08-23 11:52:24 */ package main import ( "fmt" "io" "log" "net/http" "strings" ) func main() { client := &http.Client{} // 創(chuàng)建http client var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`) // NewReader創(chuàng)建一個從s讀取數(shù)據(jù)的Reader(流) req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) // 創(chuàng)建請求,data為流(減少發(fā)送的內(nèi)存,流式創(chuàng)建請求) if err != nil { log.Fatal(err) } req.Header.Set("authority", "api.interpreter.caiyunai.com") req.Header.Set("accept", "application/json, text/plain, */*") req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6") req.Header.Set("app-name", "xy") req.Header.Set("content-type", "application/json;charset=UTF-8") req.Header.Set("device-id", "313abb19c54ae93fa733afae2f9fca47") req.Header.Set("origin", "https://fanyi.caiyunapp.com") req.Header.Set("os-type", "web") req.Header.Set("os-version", "") req.Header.Set("referer", "https://fanyi.caiyunapp.com/") req.Header.Set("sec-ch-ua", `"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"`) req.Header.Set("sec-ch-ua-mobile", "?0") req.Header.Set("sec-ch-ua-platform", `"Windows"`) req.Header.Set("sec-fetch-dest", "empty") req.Header.Set("sec-fetch-mode", "cors") req.Header.Set("sec-fetch-site", "cross-site") req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203") req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi") resp, err := client.Do(req) // 發(fā)送請求 if err != nil { log.Fatal(err) } defer resp.Body.Close() // resp.Body 也是個流,為了防止資源泄露,需要手動關(guān)閉流,defer在函數(shù)結(jié)束之后,從下往上觸發(fā) bodyText, err := io.ReadAll(resp.Body) // 從流中讀入數(shù)據(jù) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", bodyText) // 打印出JSON字符串 }
-
-
構(gòu)造結(jié)構(gòu)體 生成request body(目的是和JSON的字段對應,使得可以序列化)
接收一個普通的 Go 值(例如結(jié)構(gòu)體、切片、映射等),并返回一個字節(jié)切片(
[]byte
)表示 JSON 編碼后的數(shù)據(jù)type Dictrequest struct{ Transtype string `json:"trans_type"` Source string `json:"source"` UserID string `json:"user_id"` }
-
解析 response body
構(gòu)造結(jié)構(gòu)體,字段和body對應,把得到的JSON數(shù)據(jù)反序列化成結(jié)構(gòu)體
解決方法:代碼生成工具 JSON轉(zhuǎn)Golang Struct - 在線工具 - OKTools
將preview的JSON復制過來轉(zhuǎn)換為嵌套
修改如下
/* * @Author: NEFU AB-IN * @Date: 2023-08-23 10:35:07 * @FilePath: \GoTest\5\5.go * @LastEditTime: 2023-08-23 12:34:19 */ package main import ( "encoding/json" "fmt" "io" "log" "net/http" "strings" ) type Dictrequest struct { Transtype string `json:"trans_type"` Source string `json:"source"` UserID string `json:"user_id"` } type DictResponse struct { Rc int `json:"rc"` Wiki struct { } `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 main() { client := &http.Client{} request := DictRequest{TransType: "en2zh", Source: "good"} buf, err := json.Marshal(request) if err != nil { log.Fatal(err) } var data = bytes.NewReader(buf) // 因為JSON解析完是byte數(shù)組,所以改成bytes.NewReader req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) if err != nil { log.Fatal(err) } //client := &http.Client{} //var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`) //req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) //if err != nil { // log.Fatal(err) //} req.Header.Set("authority", "api.interpreter.caiyunai.com") req.Header.Set("accept", "application/json, text/plain, */*") req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6") req.Header.Set("app-name", "xy") req.Header.Set("content-type", "application/json;charset=UTF-8") req.Header.Set("device-id", "313abb19c54ae93fa733afae2f9fca47") req.Header.Set("origin", "https://fanyi.caiyunapp.com") req.Header.Set("os-type", "web") req.Header.Set("os-version", "") req.Header.Set("referer", "https://fanyi.caiyunapp.com/") req.Header.Set("sec-ch-ua", `"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"`) req.Header.Set("sec-ch-ua-mobile", "?0") req.Header.Set("sec-ch-ua-platform", `"Windows"`) req.Header.Set("sec-fetch-dest", "empty") req.Header.Set("sec-fetch-mode", "cors") req.Header.Set("sec-fetch-site", "cross-site") req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203") req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi") resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() bodyText, err := io.ReadAll(resp.Body) // 返回的byte數(shù)組 if err != nil { log.Fatal(err) } var dictResponse DictResponse err = json.Unmarshal(bodyText, &dictResponse) if err != nil { log.Fatal(err) } fmt.Printf("%#v\n", dictResponse) // 最詳細的打印出來 }
-
修改代碼(不再固定查詢)文章來源:http://www.zghlxwxcb.cn/news/detail-672870.html
- 修改 main 函數(shù),編寫簡單的main函數(shù),用于接收用戶輸入的單詞,并調(diào)用query函數(shù)進行查詢。
- 將代碼主體改成一個
query
函數(shù),用于查詢單詞的釋義,并通過參數(shù)傳遞要查詢的單詞。 - 使用
for range
循環(huán)迭代dictResponse.Dictionary.Explanations
,打印出查詢結(jié)果中的釋義部分,即只查詢想要的東西 - 在
query
函數(shù)中增加了對API返回狀態(tài)碼的檢查,如果不是200
,會打印錯誤信息并退出程序。
最終版文章來源地址http://www.zghlxwxcb.cn/news/detail-672870.html
/* * @Author: NEFU AB-IN * @Date: 2023-08-23 10:35:07 * @FilePath: \GoTest\5\5.go * @LastEditTime: 2023-08-23 15:20:30 */ package main import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "os" ) type DictRequest struct { TransType string `json:"trans_type"` Source string `json:"source"` UserID string `json:"user_id"` } type DictResponse struct { Rc int `json:"rc"` Wiki struct { } `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 main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, `usage: simpleDict WORD example: simpleDict hello `) os.Exit(1) } word := os.Args[1] // fmt.Println(os.Args[0]) query(word) } 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("authority", "api.interpreter.caiyunai.com") req.Header.Set("accept", "application/json, text/plain, */*") req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6") req.Header.Set("app-name", "xy") req.Header.Set("content-type", "application/json;charset=UTF-8") req.Header.Set("device-id", "313abb19c54ae93fa733afae2f9fca47") req.Header.Set("origin", "https://fanyi.caiyunapp.com") req.Header.Set("os-type", "web") req.Header.Set("os-version", "") req.Header.Set("referer", "https://fanyi.caiyunapp.com/") req.Header.Set("sec-ch-ua", `"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"`) req.Header.Set("sec-ch-ua-mobile", "?0") req.Header.Set("sec-ch-ua-platform", `"Windows"`) req.Header.Set("sec-fetch-dest", "empty") req.Header.Set("sec-fetch-mode", "cors") req.Header.Set("sec-fetch-site", "cross-site") req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203") req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi") resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() bodyText, err := io.ReadAll(resp.Body) // 返回的byte數(shù)組 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.Printf("%#v\n", dictResponse) // 最詳細的打印出來 fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs) for _, item := range dictResponse.Dictionary.Explanations { fmt.Println(item) } }
到了這里,關(guān)于Go 語言的實戰(zhàn)案例 | 青訓營的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!