我心裡有三個 GO 項目,但我不敢完成它們。我想要這樣做,並且感覺自己在這個過程中學習,而不是僅僅從 stackoverflow 和 chatgpt 複製貼上程式碼。
我想剖析專案的程式碼、概念和想法,在一篇文章中解釋,就像這樣。我相信這樣我就能吸收專案程式碼製作背後的知識。
在這三個項目中,沒有一個是非常簡單的。所以我考慮建立第四個項目,更簡單,更短,我可以在其中學到一些東西。
有總比沒有好。沒有什麼比未完成的事情更好。
但無論如何,我們就這麼做吧!
啊,這個名字真的很有趣,但我想到了 f-string 的概念,在某些程式碼中引入一個字串。
至於貓…好吧,你找到我了。人們喜歡貓。除此之外,我認為尼采會是一隻貓,而不是狗、蝴蝶、大象、恐龍或樹懶。就是這樣。它是一隻貓,因為是的。
我們首先知道我們已經有一個包含尼采引言的 txt 檔案。程式需要隨機選擇其中一個並將其提供給用戶。此外,您需要以 ASCII 格式列印貓,並在顯示的引用周圍形成對話氣泡。
簡而言之:
包含引號的文件:包含尼采引用的 .txt 文件,其中每個引用位於單獨的行上。
ASCII 貓圖:讓我們定義將在終端中列印的貓圖畫。
我喜歡這個。他有一雙迷人的眼睛。
,_ _ |\_,-~/ / _ _ | ,--. ( @ @ ) / ,-' \ _T_/-._( ( / `. \ | _ \ | \ \ , / | || |-_\__ / ((_/`(____,-'
載入並選擇隨機報價:程式將從 .txt 檔案中讀取報價並隨機選擇一個。
印出帶有對話氣泡的引言:引言將顯示在貓上方的對話氣泡內。
首先:
為專案建立目錄並導航到它:
mkdir fcat cd fcat
建立main.go檔:
touch main.go
初始化go模組:
go mod init main.go
您的目錄應如下所示:
fcat . ├── go.mod ├── main.go └── quotes.txt
現在在您首選的 IDE 中開啟 main.go。
NVIM,如果它是炒作XD
此函數開啟引文檔案 (nietzsche.txt),讀取每一行,並將所有引文儲存在清單中。
函數不會接收參數,它只會傳回字串清單/切片和錯誤:字串和錯誤:
,_ _ |\_,-~/ / _ _ | ,--. ( @ @ ) / ,-' \ _T_/-._( ( / `. \ | _ \ | \ \ , / | || |-_\__ / ((_/`(____,-'
在函數中,我們將初始化一個切片/列表以接收所有報價:
mkdir fcat cd fcat
現在,讓我們開啟txt檔案:
touch main.go
現在,我們需要建立一個「掃描器」來讀取我們的報價檔案quotes.txt。
它還需要讀取檔案的每一行。
go mod init main.go
現在,我們將在讀取引文的 txt 檔案時檢查錯誤,並返回我們的清單以及添加到其中的引文。
fcat . ├── go.mod ├── main.go └── quotes.txt
現在我們需要建立主函數來傳回引文並檢查 loadCitations 函數是否正確:
package main import ( "fmt" "os" "bufio" ) func carregarCitations()([]string, error) { }
程式碼應如下圖所示:
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string }
現在讓我們在終端機中執行程式碼
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string // Abrir o arquivo txt com as citações arquivo, err := os.Open('quotes.txt') if err != nil { return nil, err // Retorna erro se falhar em abrir arquivo } defer arquivo.Close() }
您應該在終端機中看到您的quotes.txt 檔案中的所有引號。
此函數使用 math/rand 函式庫從清單中選擇隨機報價。
在函數的括號 () 內,定義函數接收作為輸入的參數。在範例中:
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string // Abrir o arquivo txt com as citações arquivo, err := os.Open('quotes.txt') if err != nil { return nil, err // Retorna erro se falhar em abrir arquivo } defer arquivo.Close() // Criar scanner para leitura do arquivo txt scanner := bufio.NewScanner(arquivo) // Ler cada linha de cada arquivo for scanner.Scan() { linha := scanner.Text() // Obter o texto da linha citas = append(citas, linha) // Realiza a adição das linhas à lista/slice citas } }
呼叫函數時,必須傳遞一個引號列表(例如從quotes.txt檔案載入),並且該列表將在函數內使用。
在輸入括號之後,函數體 {} 之前,指定函數將傳回的值的類型。
package main import ( "fmt" "os" "bufio" ) func carregarCitations([]string, error) { // Abrir uma lista para receber as citações var citas []string // Abrir o arquivo txt com as citações arquivo, err := os.Open('quotes.txt') if err != nil { return nil, err // Retorna erro se falhar em abrir arquivo } defer arquivo.Close() // Criar scanner para leitura do arquivo txt scanner := bufio.NewScanner(arquivo) // Ler cada linha de cada arquivo for scanner.Scan() { linha := scanner.Text() // Obter o texto da linha citas = append(citas, linha) // Realiza a adição das linhas à lista citas } // Verifica se houve erro na leitura do arq txt if err := scanner.Err(); err != nil { return nil, err } // Retornar nossa lista com citações return citas, nil // Retorna lista de citações }
在這種情況下,函數將傳回一個隨機引號,它是一個字串。
但是,我們需要產生一個隨機值,但確實是隨機的。如果我們只使用 rand.Seed(),預設種子將始終相同。這就是為什麼我們需要傳遞另外兩個函數作為參數:
time.Now(),回目前時間
UnixNano(),它將把這個時間轉換為整數,表示從 1970 年 1 月 1 日起的奈秒數。高粒度就是貓咪的一躍 XD
然後我們需要函數根據引用列表的大小(長度)返回隨機引用索引
func main() { citations, err := carregarCitations() if err != nil { fmt.Println("Erro ao carregar citações", err) return } for _, citation := range citations { fmt.Println(citation) } }
len(引用) 傳回切片中的引用數量。
rand.Intn(n) 產生 0 到 n-1 之間的隨機數。
rand.Intn(len(itations)) 選擇一個有效的隨機索引來存取清單中的引文。
現在讓我們更改 main 函數來列印隨機報價:
,_ _ |\_,-~/ / _ _ | ,--. ( @ @ ) / ,-' \ _T_/-._( ( / `. \ | _ \ | \ \ , / | || |-_\__ / ((_/`(____,-'
我們的程式碼應該如下所示:
mkdir fcat cd fcat
現在在您的終端機中執行 main.go 以檢查我們是否可以獲得隨機報價:
touch main.go
此函數以 ASCII 格式顯示貓的圖畫,並在對話氣泡內列印引言。
go mod init main.go
在 main() 函數中,程式載入引號,隨機選擇一個並在氣球中列印帶有引號的貓。
fcat . ├── go.mod ├── main.go └── quotes.txt
我們的最終程式碼應如下所示:
package main import ( "fmt" "os" "bufio" ) func carregarCitations()([]string, error) { }
現在我們只需編譯我們的程式並執行它。
將 main.go 檔案編譯為 fcat:
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string }
最後,執行:
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string // Abrir o arquivo txt com as citações arquivo, err := os.Open('quotes.txt') if err != nil { return nil, err // Retorna erro se falhar em abrir arquivo } defer arquivo.Close() }
結果是這樣的:
package main import ( "fmt" "os" "bufio" ) func carregarCitations() ([]string, error) { // Abrir uma lista para receber as citações var citas []string // Abrir o arquivo txt com as citações arquivo, err := os.Open('quotes.txt') if err != nil { return nil, err // Retorna erro se falhar em abrir arquivo } defer arquivo.Close() // Criar scanner para leitura do arquivo txt scanner := bufio.NewScanner(arquivo) // Ler cada linha de cada arquivo for scanner.Scan() { linha := scanner.Text() // Obter o texto da linha citas = append(citas, linha) // Realiza a adição das linhas à lista/slice citas } }
我發現很有趣的是,如此簡單的事情執行起來卻變得如此複雜。
但令我印象深刻的是節目的開場白:「知道為什麼而活的人幾乎可以承受任何方式」
願上面這句話能激勵你繼續學習。
離子,
地球上的另一天
以上是尼采轉世為貓,用GO製作的「工具」CLI的詳細內容。更多資訊請關注PHP中文網其他相關文章!