首頁 > 後端開發 > Golang > 主體

尼采轉世為貓,用GO製作的「工具」CLI

DDD
發布: 2024-10-25 10:34:02
原創
864 人瀏覽過

Nietzsche reencarnado num gato, uma

我心裡有三個 GO 項目,但我不敢完成它們。我想要這樣做,並且感覺自己在這個過程中學習,而不是僅僅從 stackoverflow 和 chatgpt 複製貼上程式碼。

我想剖析專案的程式碼、概念和想法,在一篇文章中解釋,就像這樣。我相信這樣我就能吸收專案程式碼製作背後的知識。

在這三個項目中,沒有一個是非常簡單的。所以我考慮建立第四個項目,更簡單,更短,我可以在其中學到一些東西。

有總比沒有好。沒有什麼比未完成的事情更好。

但無論如何,我們就這麼做吧!

FCAT?

啊,這個名字真的很有趣,但我想到了 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 檔案中的所有引號。

getRandomCitation 函數

此函數使用 math/rand 函式庫從清單中選擇隨機報價。

在函數的括號 () 內,定義函數接收作為輸入的參數。在範例中:

  • itations []string 意味著 getRandomCitation 函數需要一個名為 itations 的參數,它是一個字串切片(即字串列表)。
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
    }
}

登入後複製
登入後複製
  • []string 是 Go 的「字串切片」語法,即字串的有序集合。

呼叫函數時,必須傳遞一個引號列表(例如從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
登入後複製
登入後複製
登入後複製

列印功能Cat

此函數以 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板