首页 后端开发 Golang 尼采转世为猫,用GO制作的'工具”CLI

尼采转世为猫,用GO制作的'工具”CLI

Oct 25, 2024 am 10:34 AM

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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

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

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

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

开始GO:初学者指南 开始GO:初学者指南 Apr 26, 2025 am 12:21 AM

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

Golang vs.C:性能和速度比较 Golang vs.C:性能和速度比较 Apr 21, 2025 am 12:13 AM

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

Golang的影响:速度,效率和简单性 Golang的影响:速度,效率和简单性 Apr 14, 2025 am 12:11 AM

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

C和Golang:表演至关重要时 C和Golang:表演至关重要时 Apr 13, 2025 am 12:11 AM

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

Golang vs. Python:主要差异和相似之处 Golang vs. Python:主要差异和相似之处 Apr 17, 2025 am 12:15 AM

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

Golang和C:性能的权衡 Golang和C:性能的权衡 Apr 17, 2025 am 12:18 AM

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

See all articles