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

DDD
풀어 주다: 2024-10-25 10:34:02
원래의
864명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿