구글 시작합니다.

14830 단어 Go처음
개요
문외한으로서 한 달 동안 골랑에서 앱을 제작했는데 소감과 실제 조사한 것을 조금이라도 공유해 참고해주시기 바랍니다.
어쨌든 현재 디렉터리 구성을 붙여넣을게요.

왼쪽은 root 디렉터리이고, 오른쪽은 src 디렉터리입니다.src 이 목록이 끊겼는지 고민이 많았지만 먼저 끊기로 했어요.
IDE, 개발 환경, 실행 환경
IDE는 다음과 같은 이유로 VScode를 결정했습니다.
-VS코드에 Golang 개발팀에서 제공하는pluggin(원래 마이크로소프트가 유지보수했는데 나중에 Golang 개발팀으로 이관됨)이 있기 때문에 실질적으로 VS코드는standard인 것 같습니다.
있어요. - JetBrains의 GoLand, 유료라서 이번에 건너뛰기(30일 무료 체험 가능)
-Intellij Ultimte를 사용할 때도 있음aws toolkit
Docker화
Golang 응용 프로그램은 최종적으로 리눅스의 ELF 형식의 2진법 1개에 집중되기 때문에 쉽게 docker화할 수 있다.
Golang 앱을 시작하기 위해 docker image를 찾은 결과 구글 유지보수Distroless 이미지 그룹가 발견돼 느낌이 좋아 이번에 사용하기로 했다.사이트 축소판 그림
또한, 이번 사용 Docker의 multistage build 은 Dock file에build와 응용 프로그램의 실행을 기록하는 간단한 구성입니다.
멀티스테이지-build 예
FROM golang:1.17.3-bullseye as builder ## -- buildするイメージ

COPY src/ /go/src/
WORKDIR /go/src

RUN GOOS=linux GOARCH=amd64 go build -o hoge main.go

FROM gcr.io/distroless/base:latest ## -- アプリケーション実行するイメージ & 最終的に出来上がるイメージ

COPY --from=builder /go/src/hoge /

ENTRYPOINT [ "/hoge" ]
포장 구성, 구조에 관하여
저는 Java에서 API 개발을 오래 한 사람으로서 Spring 프레임워크를 바탕으로 하는 MVC 모델에 익숙하지만 Golang은 Spring과 같은 강력한 프레임워크가 존재하지 않기 때문에 프로그래밍의 원점으로 돌아가 청정 구조를 연구하기로 결정했습니다.
디렉터리 설정 이미지에서 알 수 있듯이 디렉터리는 완전한 청결 구조에 나타난 도층을 바탕으로 자른 것이다.청결 체계 구조도 처음이라 잘 설명할 자신이 없으니 아래 기사를 참고하세요.
https://qiita.com/nrslib/items/a5f902c4defc83bd46b8
카탈로그 구성과 아키텍처에 관해 많은 선구자들이 끊임없이 모색하고 있다는 인상을 남겼고, 정답이 없어 팀 내에서 상의해 지금의 구성을 결정했다.(이런 경험이 있지만 청결 구조의 층을 잘랐다고 하지만 나중에 바꿨지만 나중에 벽에 부딪히면 다시 생각해 보겠습니다.)
웹 프레임워크는 Gin
구조 후에 프레임을 선택하십시오.
단지 github의 스타 수는 모든 지표가 아니지만 Giin이 가장 많은 스타 수는 사실이고 활발하게 개발되었고 참고할 수 있는 일본어 사이트도 많이 생겨서 Giin을 결정했습니다.
다른 진의 특징은 이렇다고 생각합니다.
  • 빠르기
  • 경량
  • JetBrains가 설문조사를 토대로 제출한 보고서도 1위여기.를 차지했다.
    프레임 비교도 참고해주세요.
    편역하다
    Golang이 지원하는 OS/CPU 아키텍처와 다음 명령을 확인할 수 있으므로 각 환경을 컴파일할 수도 있습니다.
    OS/CPU 지원
    go tool dist list
    ...(一部省略)
    linux/386
    linux/amd64
    linux/arm
    linux/arm64
    ...(一部省略)
    
    이번 공식 공연 환경은 AWS의 ECS Fargate를 구상한 것으로 며칠 전arm64의 지원 버전이 있어 linux/amd64와 linux/arm64의 컨테이너를 준비하기로 했다.(실제로 어떤 것을 사용할지는 아직 결정되지 않았지만arm64가 에너지를 더 절약하는 것 같다.)
    정식 사용 및 개발용 컴파일 옵션 정보-race:thread-safe 같은 것을 검사한다(실제로 응용 프로그램이 느려진다는 보도도 있기 때문에 검사는 개발 환경에만 한정되며 정식으로 컴파일할 때 열지 않는다)-w -s: 이 옵션을 추가하지 않으면 Debug용 메시지가 나오기 때문에 정식 공연 때는 없습니다.
    예제 컴파일
    // 開発用
    go build -race -o hoge main.go
    
    // 本番用
    go build -o hoge main.go -ldflags "-w -s"
    
    교차 컴파일 시 주의사항
    교차 컴파일은 사용할 수 없습니다 -race.상세한 상황은 여기에 있다
    예:amd64 서버에서arm64용 파일을 컴파일할 때
    Makefile 정보
    Golang은 컴파일러 언어로 Makefile을 사용하는 것이 주류가 되었다.
    build 명령과 환경 구축 명령을 Makefile에 모으는 것이 편리합니다.
    예를 들어 Makefile에서 정식 사용과 개발용의 컴파일 옵션에 대해 소개한 개발 환경과 정식 사용 환경의 컴파일 차별화를 총괄하였으며, 한make 명령으로 실행할 수도 있다.
    예제
    # disable symbol table and dwarf
    GO_LDFLAGS_SYMBOL:=
    ifeq ($(HOGE_ENV),prod)
        GO_LDFLAGS_SYMBOL:=-w -s
    endif
    
    GO_LDFLAGS:=$(GO_LDFLAGS_SYMBOL)
    
    # race detector
    GO_BUILD_RACE:=-race
    ifeq ($(HOGE_ENV),prod)
        GO_BUILD_RACE:=
    endif
    
    # go build
    GO_BUILD:=$(GO_BUILD_RACE) -ldflags "$(GO_LDFLAGS)"
    
    .PHONY: build
    build:
        GOOS=linux GOARCH=amd64 go build -o hoge $(GO_BUILD) main.go
    
    make 명령 예
    # 開発環境用build
    HOGE_ENV=dev make build
    
    # 本番環境用build
    HOGE_ENV=prod make build
    
    라이브러리 작업
    viper
    JSON, YAML, TOML 등을 지원하는 설정 파일용 라이브러리
    참고할 수 있는 자료가 많기 때문에 우리는 사랑을 끊을 것이다. 단지 어떻게 사용하는지 간단하게 소개할 뿐이다.go:embed 조합 사용.
    go:embed는 컴파일된 ELF 형식의 바이너리 파일에 정적 파일을 포함하는 기능을 제공합니다
    디렉토리
    ├── config.go
    └── yaml
        ├── config.prod.yml
        └── config.dev.yml
    
    config.xxx.예제
    database:
      postgres:
        name: hoge
        host: localhost
        port: 5432
        user: user
        pass: password
    
    위의 디렉토리 구조에 각 환경에 대한 설정(DB 설정 등)을 저장하면 config입니다.goo의 내용은 이렇다.
    config.go
    type Config struct {
        Database struct {
            Postgres struct {
                Name string
                Host string
                Port string
                User string
                Pass string
            }
        }
    }
    
    var (
        //go:embed yaml/*
        staticYamlDir embed.FS
    )
    
    func LoadConfig() *Config {
        setDefaultEnv()
        hogeEnv := viper.GetString("env")
        fileName := "yaml/config." + hogeEnv + ".yml"
        viper.SetConfigName("config." + hogeEnv)
        viper.SetConfigType("yaml")
        viper.AddConfigPath("config/yaml")
    
        b, err := staticYamlDir.ReadFile(fileName)
    
        if err != nil {
            panic("Failed to read config.")
        }
    
        if err := viper.ReadConfig(bytes.NewReader(b)); err != nil {
            panic("Failed to load config.")
        }
    
        var c Config
    
        if err := viper.Unmarshal(&c); err != nil {
            panic("Failed to unmarshal config.")
        }
    
        return &c
    }
    
    func setDefaultEnv() {
        viper.SetEnvPrefix("hoge")
        viper.BindEnv("env")
        viper.AutomaticEnv()
        viper.SetDefault("env", "dev")
    }
    
    이렇게 하면 프로그램이 시작될 때HOGE_ENV에 환경 변수를 설정하면 읽는config 파일이 각각 다르기 때문에 서로 다른 환경의 설정을 파일로 나누어 관리할 수 있다.
    sqlboiler
    ORM 라이브러리입니다.사용하기 싫다.
    유명한 GORM이 있는데 이번에 sqlboiler를 채택한 것은 다음과 같은 관점에서 출발한 것이다.
  • schema에서 코드를 쉽게 생성할 수 있음
  • 정적 포맷이 이루어져 반사를 사용하지 않아도 되므로 속도가 빠릅니다
  • .
  • migration 기능은 없지만 flyway 등으로 덮어쓰기
  • 생query
  • relation도 지원
  • air
    Golang은 컴파일러 언어이기 때문에 개발할 때 반드시 빈번하게 수정, 구축, 운행 주기를 진행해야 한다.
    에어는 현지의 개발 효율을 높였다. 이른바 자동 순환의 열자원 라이브러리다.
    감상
    자바처럼 선제공격을 하면 아무것도 쓰지 않을 것이다. 어쨌든 코드를 솔직하게 쓰는 것이 골랑의 특징이다.(자바는 원래 스프링처럼 강력한 무기가 있기 때문에 언어만 비교할 수 없다)
    이점:
  • 졸업생이라도 코드를 보면 쉽게 이해할 수 있다
  • 경량, 고속
  • 와 클라우드, 용기기술, 마이크로서비스 등 친화성이 높음
  • 번거로운 점: Golang은 예외적인 개념이 없고 자주if err != nil 해야 한다
    골랑의 디자인 마인드는 무엇이든 간단하기 때문에 다른 언어와 차별화하고 많은 지지를 받아 좋지 않은 부분이 있을 수 있지만 앞으로도 우호적인 분위기가 이어질 것으로 보인다.
    최후
    새로운 언어를 공부할 때 인터넷에는 다양한 정보가 널려 있다. 실제로 이렇게 해보면 유행이 지난 방법이나 반모드로 할 수 있으니 공식 문서를 먼저 읽어보는 것이 좋다.특히 골랑의 공식 문서는 튼튼하고 읽기 쉬우니 꼭 확인해 주세요.
  • 공식 문서

  • Effective go ※ 이것들은 꼭 읽어주세요.
  • Golang의 눈동자 기능: Goroutine, channel에 관심이 있지만 아직 접촉하지 않았습니다. 앞으로도 이 일대를 공략하고 싶습니다.
    끝.

    좋은 웹페이지 즐겨찾기