前文回顧
上一篇文章,我們介紹了 Go 語言的一些特性以及環境的安裝。具體可以參見:
https://juejin.cn/user/3491704659786455Golang 簡單、高效、并發的特性吸引了衆多開發人員加入到 Golang 開發的大家庭中,目前已經湧現大量通過 Golang 原生開發的大型開源項目, 并在軟體行業中發揮重要作用,其中包括 Docker、Kubernetes、etcd 等。
hello Go
本文我們将編寫我們的第一個 Golang 程式,正式成為一名 Golang 開發者。相信大多數讀者的第一個可運作的程式都是簡單的 “Hello World” 輸出,這代表了我輩程式員對計算機世界無盡的探索熱情和激情。同時大多數讀者也會對這個簡單的 HelloGo 小程式表示不屑,因為它并不能展現太多的文法和語言特性。
是以我們決定稍微提高一下第一個 Golang 程式的編碼難度,HelloGo.go 将會是一個簡單的指令行聊天機器人,它将展示部分 Golang 特性,讓讀者們對 Golang 語言有一個大緻的了解。即使第一次沒有讀懂代碼也并沒有關系,随着知識點的逐漸展開與深入,相信再回頭時讀者能夠輕易讀懂以下代碼。
// 每一個可執行的 golang 程式必定具備一個 main 包,并在該 main 包下具有執行函數 main 的 go 檔案
package main
// HelloGo.go
// 基于圖靈 API 一個簡單的聊天機器人
// 引入相關依賴
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
)
// 請求體結構體
type requestBody struct {
Key string `json:"key"`
Info string `json:"info"`
UserId string `json:"userid"`
}
// 結果體結構體
type responseBody struct {
Code int `json:"code"`
Text string `json:"text"`
List []string `json:"list"`
Url string `json:"url"`
}
// 請求機器人
func process(inputChan <-chan string, userid string) {
for{
// 從通道中接受輸入
input := <- inputChan
if input == "EOF"{
break
}
// 建構請求體
reqData := &requestBody{
Key: "792bcf45156d488c92e9d11da494b085",
Info : input,
UserId: userid,
}
// 轉義為 json
byteData,_ := json.Marshal(&reqData)
// 請求聊天機器人接口
req, err := http.NewRequest("POST",
"http://www.tuling123.com/openapi/api",
bytes.NewReader(byteData))
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Network Error!")
}else {
// 将結果從 json 中解析并輸出到指令行
body, _ := ioutil.ReadAll(resp.Body)
var respData responseBody
json.Unmarshal(body, &respData)
fmt.Println("AI: " + respData.Text)
}
resp.Body.Close()
}
}
func main() {
var input string
fmt.Println("Enter 'EOF' to shut down: ")
// 建立通道
channel := make(chan string)
// main 結束時關閉通道
defer close(channel)
// 啟動 goroutine 運作機器人回答線程
go process(channel, string(rand.Int63()))
for {
// 從指令行中讀取輸入
fmt.Scanf("%s", &input)
// 将輸入放到通道中
channel <- input
// 結束程式
if input == "EOF"{
fmt.Println("Bye!")
break
}
}
}
在上述這段長長的
HelloGo
程式中,我們通過
import
關鍵字引入了諸多的依賴包。在 Golang 中,主要通過
import
引入外部依賴。
可以注意到代碼位于
main
包下,Golang 中規定可執行程式必須具備
main
包,具備可以執行函數
main
的 go 檔案必須位于該包下。而且 Golang 中的代碼通過換行符分割,不需要在每行代碼後加上
;
等結束符。
我們還定義了兩個結構體,和兩個函數。兩個結構體分别代表請求體和結果體的 JSON 格式。
process
函數執行了從通道中擷取輸入消息并發送到聊天機器人 API,進而擷取傳回結果的邏輯。
main
函數啟動了這個程式,從指令行中等待輸入,并把輸入放入到通道中,同時通過 goroutine 啟動了一個新的線程執行
process
函數。通道可以了解為
main
函數線程和
process
函數線程資訊傳遞的工具。
小結
本文較為簡單,主要介紹了使用 Go 語言編寫一個簡單的程式。我們的聊天機器人的邏輯很簡單,即從指令行中讀取使用者輸入,然後調用遠端聊天機器人的 API 進行分析,使用 API 中傳回的結果回報給使用者。
下面的文章我們将會介紹相關的 GO 語言編譯工具。
閱讀最新文章,關注公衆号:aoho求索