尼采转世为猫,用GO制作的'工具”CLI
我心里有三个 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。
