ホームページ  >  記事  >  バックエンド開発  >  ニーチェが猫に転生、GO で作られた「ツール」 CLI

ニーチェが猫に転生、GO で作られた「ツール」 CLI

DDD
DDDオリジナル
2024-10-25 10:34:02805ブラウズ

Nietzsche reencarnado num gato, uma

GO プロジェクトが 3 つ考えられていますが、完了するのが怖いです。 stackoverflow や chatgpt からコードをコピーして貼り付けるだけではなく、その過程で学んでいるという実感を持ちたいと思っています。

このように、プロジェクトのコード、コンセプト、アイデアを分析して記事で説明したいと思います。そうすることで、プロジェクトコード作成の裏にある知識を吸収できると信じています。

3 つのプロジェクトのうち、どれもそれほど単純ではありません。そこで、よりシンプルで短く、何かを学べる 4 番目のプロジェクトを構築することを考えました。

何もしないよりは何かあった方が良いです。そして、未完成のものほど良いものはありません。

でも、とにかくやってみましょう!

FCAT?

ああ、その名前は本当に面白いですが、コードに文字列を導入する f 文字列の概念について考えてみました。

猫については...まあ、わかりました。人々は猫が好きです。これに加えて、私はニーチェは犬、蝶、象、恐竜、ナマケモノではなく猫になるだろうと思っていました。それで終わりです。それは猫です、なぜならそうです。

何が問題ですか?

ニッチェの引用を含む txt ファイルが既にあるという事実から始めます。プログラムはこれらのうち 1 つをランダムに選択し、ユーザーが使用できるようにする必要があります。さらに、猫を 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 関数が正しいかどうかを確認する main 関数を作成する必要があります。

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 ライブラリを使用して、リストからランダムな引用符を選択します。

関数のかっこ () 内で、関数が入力として受け取るパラメーターを定義します。例では:

  • citations []string は、getRandomCitation 関数が文字列のスライス (つまり、文字列のリスト) である ciliations と呼ばれる引数を予期していることを意味します。
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() のみを使用する場合、デフォルトのシードは常に同じになります。そのため、他の 2 つの関数をパラメータとして渡す必要があります:

  • 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(quotes)) は、リストから引用にアクセスするための有効なランダム インデックスを選択します。

そして、ランダムな引用を出力するように 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。