首页 > 后端开发 > 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板