我心里有三个 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中文网其他相关文章!