>  기사  >  백엔드 개발  >  고양이로 환생한 니체, GO로 만든 \"도구\" CLI

고양이로 환생한 니체, GO로 만든 \"도구\" CLI

DDD
DDD원래의
2024-10-25 10:34:02805검색

Nietzsche reencarnado num gato, uma

GO 프로젝트 세 개를 염두에 두고 있는데 끝내기가 두렵습니다. 그냥 stackoverflow나 chatgpt에서 코드를 복사해서 붙여넣는 것이 아니라, 그 과정에서 배우고 있다는 느낌을 받고 싶어요.

기사에서 설명할 프로젝트의 코드, 컨셉, 아이디어를 이렇게 분해하고 싶습니다. 이렇게 하면 프로젝트 코드 제작에 대한 지식을 흡수할 수 있을 것이라고 믿습니다.

세 가지 프로젝트 중 아주 간단한 프로젝트는 없습니다. 그래서 더 간단하고 짧으며 뭔가 배울 수 있는 네 번째 프로젝트를 만들어볼까 생각했습니다.

없는 것보다는 있는 것이 낫습니다. 그리고 미완성된 것보다 더 좋은 것은 없습니다.

그래도 해보자!

FCAT?

아 이름이 참 웃기긴 한데, 코드에 문자열을 도입하는 f-string의 개념을 생각해 봤습니다.

고양이에 관해서는... 음, 알겠습니다. 사람들은 고양이를 좋아합니다. 여기에 더해 니체는 개, 나비, 코끼리, 공룡, 나무늘보가 아닌 고양이가 될 거라고 생각했다. 그래서 그게 다입니다. 고양이이니까요.

무엇이 문제인가요?

Nitzsche의 인용문이 포함된 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

코드 설명:

loadCitations 함수

이 기능은 인용 파일(nietzsche.txt)을 열고 각 줄을 읽고 모든 인용을 목록에 저장합니다.

함수는 인수를 받지 않고 문자열 목록/조각과 오류: 문자열 및 오류:
를 반환합니다.

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

함수 내에서 모든 인용문을 수신하기 위해 슬라이스/목록을 초기화합니다.

mkdir fcat
cd fcat

이제 txt 파일을 열어보겠습니다.

touch main.go

이제 인용문 파일 quote.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()   
}

터미널의 quote.txt 파일에 모든 인용문이 표시되어야 합니다.

getRandomCitation 함수

이 함수는 math/rand 라이브러리를 사용하여 목록에서 임의의 인용문을 선택합니다.

함수의 괄호() 안에는 함수가 입력으로 받는 매개변수를 정의합니다. 예에서:

  • citations []string은 getRandomCitation 함수가 문자열 조각(즉, 문자열 목록)인 citations라는 인수를 기대한다는 것을 의미합니다.
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의 구문입니다.

함수를 호출할 때 따옴표 목록(예: quote.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()

  • 이 시간을 1970년 1월 1일 이후의 나노초 수를 나타내는 정수로 변환하는 UnixNano(). 고양이의 도약이라는 높은 세분성 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(citations)은 슬라이스의 인용 횟수를 반환합니다.

  • rand.Intn(n)은 0과 n-1 사이의 난수를 생성합니다.

  • rand.Intn(len(citations))은 목록에서 인용에 액세스하기 위해 유효한 무작위 인덱스를 선택합니다.

이제 무작위 인용문을 인쇄하도록 기본 기능을 변경해 보겠습니다.

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

코드는 다음과 같습니다.

mkdir fcat
cd fcat

이제 터미널에서 main.go를 실행하여 무작위 견적을 받을 수 있는지 확인하세요.

touch main.go

인쇄 기능고양이

고양이 그림을 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으로 문의하세요.