Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Nietzsche menjelma semula dalam kucing, CLI \"alat\" yang dibuat dengan GO

Nietzsche menjelma semula dalam kucing, CLI \"alat\" yang dibuat dengan GO

DDD
DDDasal
2024-10-25 10:34:02805semak imbas

Nietzsche reencarnado num gato, uma

Saya mempunyai tiga projek GO dalam fikiran, tetapi saya takut untuk menyelesaikannya. Saya mahu melakukannya dan merasakan bahawa saya sedang belajar dalam proses, bukannya hanya menyalin dan menampal kod daripada stackoverflow dan chatgpt.

Saya ingin membedah kod, konsep dan idea projek untuk dijelaskan dalam artikel, seperti ini. Saya percaya dengan cara ini saya akan dapat menyerap pengetahuan di sebalik penghasilan kod projek.

Daripada tiga projek, tiada satu pun yang terbukti sangat mudah. Jadi saya terfikir untuk membina projek keempat, lebih ringkas, lebih pendek dan tempat saya boleh belajar sesuatu.

Sesuatu lebih baik daripada tiada. Dan tiada yang lebih baik daripada apa-apa yang belum selesai.

Tetapi bagaimanapun, mari lakukannya!

FCAT?

Ah, nama itu benar-benar lucu, tetapi saya memikirkan konsep f-string, di mana anda memperkenalkan rentetan ke dalam beberapa kod.

Bagi kucing... baiklah, awak dapat saya. Orang suka kucing. Ditambah dengan ini, saya fikir Nietzsche akan menjadi kucing, bukannya anjing, rama-rama, gajah, dinosaur atau sloth. Jadi itu sahaja. Ia adalah kucing, kerana YA.

Apa masalahnya?

Kami bermula dengan fakta bahawa kami sudah mempunyai fail txt dengan petikan Nitzsche. Program ini perlu memilih salah satu daripada ini secara rawak dan menyediakannya kepada pengguna. Selain itu, anda perlu mencetak kucing dalam ASCII dan membentuk gelembung pertuturan di sekeliling petikan yang dipaparkan.

Ringkasnya:

Fail dengan petikan: Fail .txt dengan petikan daripada Nietzsche, di mana setiap petikan berada pada baris yang berasingan.

Lukisan kucing dalam ASCII: Mari tentukan lukisan kucing yang akan dicetak dalam terminal.

Saya suka yang ini. Dia mempunyai mata yang memukau.

 ,_     _
 |\_,-~/
 / _  _ |    ,--.
(  @  @ )   / ,-'
 \  _T_/-._( (
 /         `. \
|         _  \ |
 \ \ ,  /      |
  || |-_\__   /
 ((_/`(____,-'

Muat dan pilih petikan rawak: Program akan membaca petikan daripada fail .txt dan memilih satu secara rawak.

Cetak petikan dengan gelembung pertuturan: Petikan akan dipaparkan di dalam gelembung pertuturan di atas kucing.

Mari pergi, sayang

Pertama sekali:

Buat direktori untuk projek dan navigasi ke sana:

mkdir fcat
cd fcat

Buat fail main.go:

touch main.go

Mulakan modul go:

go mod init main.go

Direktori anda sepatutnya kelihatan seperti ini:

fcat
.
├── go.mod
├── main.go
└── quotes.txt

Sekarang buka main.go dalam IDE pilihan anda.

NVIM jika ia gembar-gembur XD

Penjelasan kod:

fungsi loadCitation

Fungsi ini membuka fail petikan (nietzsche.txt), membaca setiap baris dan menyimpan semua petikan dalam senarai.

Fungsi tidak akan menerima hujah, ia hanya akan mengembalikan senarai/kepingan rentetan dan ralat: rentetan dan ralat:

 ,_     _
 |\_,-~/
 / _  _ |    ,--.
(  @  @ )   / ,-'
 \  _T_/-._( (
 /         `. \
|         _  \ |
 \ \ ,  /      |
  || |-_\__   /
 ((_/`(____,-'

Dalam fungsi kami akan memulakan hirisan/senarai untuk menerima semua petikan:

mkdir fcat
cd fcat

Sekarang, mari buka fail txt:

touch main.go

Sekarang, kami perlu membuat "pengimbas" untuk membaca fail petikan kami quotes.txt.

Ia juga perlu membaca setiap baris fail.

go mod init main.go

Sekarang, kami akan menyemak ralat semasa membaca fail txt petikan dan mengembalikan senarai kami dengan petikan yang telah ditambahkan padanya.

fcat
.
├── go.mod
├── main.go
└── quotes.txt

Sekarang kita perlu mencipta fungsi utama untuk mengembalikan petikan dan menyemak sama ada fungsi loadCitations betul:

package main

import (
    "fmt"
    "os"
    "bufio" 
)

func carregarCitations()([]string, error) {
}

Kod sepatutnya kelihatan seperti ini:

package main

import (
    "fmt"
    "os"
    "bufio" 
)

func carregarCitations() ([]string, error) {

    // Abrir uma lista para receber as citações
    var citas []string

}

Sekarang mari jalankan kod dalam terminal

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()   
}

Anda sepatutnya melihat semua petikan dalam fail quotes.txt anda dalam terminal anda.

fungsi getRandomCitation

Fungsi ini menggunakan perpustakaan matematik/rand untuk memilih petikan rawak daripada senarai.

Di dalam kurungan fungsi (), anda mentakrifkan parameter yang diterima oleh fungsi sebagai input. Dalam contoh:

  • petikan []rentetan bermaksud fungsi getRandomCitation menjangkakan hujah yang dipanggil petikan, iaitu sepotong rentetan (iaitu senarai rentetan).
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
    }
}

  • []rentetan ialah sintaks Go untuk "sepotong rentetan", iaitu koleksi rentetan tersusun.

Apabila anda memanggil fungsi tersebut, anda mesti lulus senarai petikan (cth. dimuatkan daripada fail quotes.txt), dan senarai ini akan digunakan dalam fungsi tersebut.

Selepas kurungan input, sebelum badan fungsi {}, anda tentukan jenis nilai yang akan dikembalikan oleh fungsi itu.

  • rentetan sejurus selepas kurungan bermakna fungsi itu akan mengembalikan rentetan apabila selesai melaksanakan.
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
}

Dalam kes ini, fungsi akan mengembalikan petikan rawak, iaitu rentetan tunggal.

Walau bagaimanapun, kita perlu menjana nilai rawak, tetapi BENAR-BENAR rawak. Jika kita hanya menggunakan rand.Seed(), benih lalai akan sentiasa sama. Itulah sebabnya kita perlu lulus dua fungsi lain sebagai parameter:

  • masa.Sekarang(), yang mengembalikan masa semasa

  • UnixNano(), yang akan menukar masa ini kepada integer, mewakili bilangan nanosaat sejak 1 Januari 1970. Kebutiran tinggi yang merupakan lompatan kucing XD

Dan kemudian kita memerlukan fungsi untuk mengembalikan indeks rawak petikan mengikut saiz senarai petikan (panjang)

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(citations) mengembalikan bilangan petikan dalam kepingan.

  • rand.Intn(n) menjana nombor rawak antara 0 dan n-1.

  • rand.Intn(len(citations)) memilih indeks rawak yang sah untuk mengakses petikan daripada senarai.

Dan sekarang mari tukar fungsi utama untuk mencetak petikan rawak:

 ,_     _
 |\_,-~/
 / _  _ |    ,--.
(  @  @ )   / ,-'
 \  _T_/-._( (
 /         `. \
|         _  \ |
 \ \ ,  /      |
  || |-_\__   /
 ((_/`(____,-'

Kod kami sepatutnya kelihatan seperti ini:

mkdir fcat
cd fcat

Sekarang jalankan main.go di terminal anda untuk menyemak sama ada kami boleh mendapatkan sebut harga rawak:

touch main.go

Fungsi cetakanCat

Fungsi ini memaparkan lukisan kucing dalam ASCII dan mencetak petikan di dalam gelembung pertuturan.

go mod init main.go

fungsi utama

Dalam fungsi utama(), program memuatkan petikan, memilih satu rawak dan mencetak kucing dengan petikan dalam belon.

fcat
.
├── go.mod
├── main.go
└── quotes.txt

Kod akhir kami sepatutnya kelihatan seperti ini:

package main

import (
    "fmt"
    "os"
    "bufio" 
)

func carregarCitations()([]string, error) {
}

Penamat

Sekarang kita hanya perlu menyusun atur cara kita dan menjalankannya.

Kompilasikan fail main.go anda sebagai fcat:

package main

import (
    "fmt"
    "os"
    "bufio" 
)

func carregarCitations() ([]string, error) {

    // Abrir uma lista para receber as citações
    var citas []string

}

Dan akhirnya, laksanakan:

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()   
}

Inilah hasilnya:

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
    }
}

Saya mendapati ia menarik bagaimana sesuatu yang begitu mudah boleh menjadi sangat rumit untuk dilaksanakan.

Tetapi apa yang menarik perhatian saya ialah baris pembukaan program: "Dia yang mempunyai sebab untuk hidup boleh menanggung hampir semua cara"

Semoga ayat di atas memberi semangat untuk terus belajar.


ion,

Satu hari lagi di bumi

Atas ialah kandungan terperinci Nietzsche menjelma semula dalam kucing, CLI \"alat\" yang dibuat dengan GO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn