studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 패키지 이름 규칙
  • main 패키지
  • command, package
  • import
  • remote import
  • renaming
  • init
  • Go 내장 도구 사용
  • 문서화 도구
  • 의존성 관리
  • vendoring, import path rewriting
  1. Go
  2. Go in Action

3장 패키지

go의 경우 각각의 패키지를 개별적으로 가져오기 및 활용이 가능. 덕분에 여타 언어처럼 큰 모듈을 통째로 가져올 필요 없이 필요한 특정 기능만을 가져오는 것이 가능.

모든 .go 파일들은 공백 및 주석을 제외한 첫 줄에 자신의 패키지 이름이 위치해야 함.

동일한 패키지는 동일한 디렉토리에 저장됨. 즉, 하나의 디렉토리에 여러 패키지가 존재할 수 없음.

패키지 이름 규칙

  • 반드시 디렉토리의 이름과 동일해야 한다.

  • 짧고 간결하면 소문자로만 구성되어야 한다.

main 패키지

  • 모든 go 프로그램은 main 패키지를 가져야 한다.

  • main 패키지 안에는 반드시 main() 함수가 있어야 한다.

  • main 패키지는 다른 이름의 디렉토리 안에 존재할 수 있으며 이 경우 해당 디렉토리 이름으로 바이너리가 컴파일된다.

command, package

  • command: Go에서 command는 대부분의 실행 가능한 프로그램을 의미

  • package: Go에서 package는 import가 가능한 의미적 단위

import

  • import "package name"

  • import (
      "package 1"
      "package 2"
    )
  • 일반 패키지의 경우 GOPATH 를 기준으로 상대 경로 탐색

  • 표준 라이브러리 패키지의 경우 Go 설치 경로를 기준으로 탐색

  • GOPATH 에 나열된 순서대로 하나하나 탐색. 가장 먼저 발견하는 패키지 참조

remote import

  • 네트워크 저장소에서 패키지를 읽어오는 방법

  • go get 사용

renaming

  • 여러 패키지의 이름이 동일할 때 사용하는 방법

  • import newName "package"

  • go의 경우 import한 패키지를 한번도 참조하지 않으면 컴파일러 에러 발생.

    • 참조하진 않지만 꼭 import할 필요성이 있다면 (init() 메소드의 호출 필요 등) 빈 식별자로 패키지 이름 지정

    • import _ "unused"

init

  • 초기화 작업을 위해 사용하는 함수

  • main()이 실행되기 전에 먼저 실행됨

  • DB driver 등 런타임 초기화에서 사용됨

  • init() 메소드는 필요하지만 패키지 자체를 사용할 일은 없다면 빈 식별자로 패키지 이름 지정 필요

Go 내장 도구 사용

  • go build

    • 패키지 또는 경로 사용 가능.

    • 패러미터가 없으면 현재 경로 기준으로.

    • 경로에 ... 을 넣으면 와일드카드로 동작.

  • go clean

    • 빌드 결과물 삭제

  • go run

    • 빌드하고 바로 실행

  • go vet

    • 코드 정적 검사

  • go fmt

    • 코드 리포맷

    • 가능한한 많이 사용하는걸 추천. 적어도 커밋하기 이전에는 한번 실행하는게 좋음.

문서화 도구

  1. go doc

    1. CLI 환경에서 사용

    2. 패러미터로 패키지 이름 사용

  2. godoc

    1. 브라우저로 문서 탐색하고 싶을 때 사용

    2. 로컬에 웹서버 띄우는 것도 가능

    3. 외부 패키지는 물론 직접 작성한 패키지에 대해서도 문서 제공

의존성 관리

  • godep

  • vendor

  • gopkg.in

vendoring, import path rewriting

  • 모든 dependency를 프로젝트 디렉토리 내부에 복사

  • dependency를 참조하는 import를 복사한 경로로 재작성

PreviousGo in ActionNext4장 배열, 슬라이스, 맵

Last updated 6 years ago