레이블이 Golang인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Golang인 게시물을 표시합니다. 모든 게시물 표시

20250114

init함수, main함수 관련 - golang

init함수, main함수 관련 - golang

init 함수는 패키지 초기화 작업을 위해 사용됩니다.

- init 함수는 패키지가 처음 로드될 때 자동으로 호출됩니다.

- init 함수는, main함수보다 아래에 있던, 위에 있던, 먼저 실행됩니다.

- init함수는 가독성을 위해서, 관례상, 예의상 main함수보다 위에 배치합니다.

- 명시적으로 호출할 수 없습니다.(자동호출됨. 개발자가 직접 호출은 못함)

- 패키지 내 init 함수는 파일 상단에서 아래로, 왼쪽에서 오른쪽 순서로 실행됩니다.

- 패키지 의존 관계에 따라 import된 순서대로 실행됩니다.

- 너무 많은 init 함수는 코드 가독성을 떨어뜨릴 수 있고, init함수는 단순 초기화 작업만 담당.

- init 함수는 자동 실행되므로, 예상치 못한 동작을 디버깅하기 어려울 수 있습니다.


init 함수는 함수처럼 선언하지만, 파라미터나 반환값이 없습니다.

func init() {
// 초기화 코드
}

- 하나의 파일에 init 함수를 여러 개 정의할 수 있습니다.

- 같은 패키지 내의 파일에 각각 init 함수를 정의할 수도 있습니다.

// 패키지 초기화: 변수 초기화 또는 외부 데이타베이 연결

func init() {
globalVar = 42
fmt.Println("패키지 초기화 완료!")
}

의존성 처리: 패키지가 의존하는 리소스 또는 설정을 준비.

// 검증작업: 패키지 설정이나 환경 변수를 확인

func init() {
if os.Getenv("APP_ENV") == "" {
log.Fatal("APP_ENV 환경 변수가 필요합니다!")
}
}


main 함수는 프로그램의 시작점으로, 실행 로직을 포함합니다.

- main 함수는 Go 프로그램의 시작점이자 핵심 실행부입니다.

Go 런타임은 프로그램 실행 시 main 패키지의 main 함수를 찾아 실행합니다.

- main 함수는 프로그램 실행의 시작점입니다. 1개만 있어야 함.

- main 함수는 프로그램 실행의 시작점입니다.

- main 함수는 프로그램 실행의 시작점입니다.

- 프로그램의 진입점 입니다.

- Go 프로그램은 반드시 하나의 main 패키지를 가져야 하며, main 패키지의 main 함수가 실행됩니다.

- main 함수는 프로그램 실행 시 호출되는 첫 번째 함수입니다(단, init 함수가 먼저 실행된 뒤 호출).

- 필수 함수 입니다.

- main 함수는 프로그램 실행을 위해 반드시 정의해야 합니다.

- 정의하지 않으면 컴파일 오류가 발생합니다.

- main 함수는 반드시 main 패키지에만 존재할 수 있습니다.

- 다른 패키지에서는 main 함수 이름을 사용할 수 없습니다.

// 반환값이 없고, 매개변수를 받지 않습니다.

func main() {
// 프로그램 실행 로직
}

- 다른 패키지를 호출하거나 사용하는 작업을 수행합니다.

- 전체 프로그램의 실행 흐름을 제어합니다.

- main 함수가 호출되기 전에 필요한 초기화 작업은 init 함수에서 처리됩니다.

package main // Go 프로그램은 반드시 하나의 패키지에서 시작해야 합니다.
// main 패키지는 Go 프로그램의 진입점 역할을 합니다.

import ( // 외부 패키지를 현재 파일에 가져오는 데 사용됩니다.
"fmt" // fmt는 표준 라이브러리 중 하나로, 데이터를 출력하거나 형식을 지정하는 기능
)

func init() {
fmt.Println("init 함수 실행")
}

func main() {
fmt.Println("main 함수 실행")
}

- main 함수는 반환값을 가질 수 없습니다. 즉, func main() int는 불가능합니다.

- 다른 함수처럼 main()을 호출할 수 없습니다.

- 하나의 프로그램에서 main 함수는 하나만 정의할 수 있습니다.












20250113

클로저(closure) 에 대하여 - golang

클로저(closure)의 개념

클로저는 함수가 외부 환경의 변수를 캡처하여 기억하는 기능입니다.

- 함수 + 지역변수 값 = 변수에 저장해두는 개념 입니다.

값을 기억하고 있는, 함수라고 말할수 있습니다. return되는 함수를(공식을) 들고 있는 변수 개념.

클로저는 함수와 해당 함수가 선언된 환경(context)을 함께 저장하는 구조입니다.

함수가 외부 함수의 변수(지역 변수 포함)를 기억하고 사용할 수 있습니다.

클로저로 만들어진 함수는 호출될 때마다 상태를 유지합니다.

intSeq 함수에서 반환된 익명 함수 intSeq 내부의 지역 변수 i를 참조하므로, 이 익명 함수는 i를 기억하고 유지할 수 있습니다. 클로저는 같은 함수 내에 정의된 변수를 참조할 수 있는 함수 객체입니다.

func intSeq() func() int {
i := 0 // 함수 내부에서 선언된 i는 지역 변수, 이 함수가 호출될 때마다 새로 초기화됩니다.
// 이 변수는 intSeq의 반환값으로 리턴되는 익명 함수(클로저)에서 참조됩니다.
// 익명 함수란 이름이 없는 함수입니다.
// 반환값: func() int
// 고차 함수란 함수를 매개변수로 받거나, 함수를 반환하는 함수입니다.
return func() int {
i++
return i
}
}

func intSeq() func() int

- 이 선언은 intSeq라는 함수의 정의 입니다.

- intSeq는 클로저를 반환하는 함수입니다.

- intSeq는 반환값으로 함수를 리턴합니다.

고차 함수란 함수를 매개변수로 받거나, 함수를 반환하는 함수입니다.

- 반환하는 함수는 func() int 타입으로, 매개변수를 받지 않고 int 값을 반환합니다.


return func() int { i++; return i }

- intSeq 함수는 익명 함수 func() int { i++; return i } 를 반환합니다. **

- 이 익명 함수는 i 값을 증가시킨 후, 증가된 값을 반환합니다.

  (이 익명 함수는 intSeq 내부에서 선언된 i를 기억합니다.)

  (중요한 점은 익명 함수가 intSeq 함수 내부의 i를 계속 기억한다는 점입니다.)

- 반환된 익명 함수는 i라는 변수를 계속 사용할 수 있는 특별한 함수입니다. 이 특성을 클로저(closure)의 핵심 이라고 합니다.


func main() {
nextInt := intSeq() // 클로저를 반환받아 저장. func() int { i++; return i } 
//intSeq()를 호출하면 i := 0이 생성되고 이를 기억하는 함수가 반환됩니다.
fmt.Println(nextInt()) // 1 nextInt()는 반환된 함수로, 호출할 때마다 i를 1씩 증가시킴
fmt.Println(nextInt()) // 2 nextInt()는 i값 기록있는 func() int { i++; return i }가 실행됨
fmt.Println(nextInt()) // 3 nextInt()는 i값 기록있는 func() int { i++; return i }가 실행됨

// 새로운 클로저 생성- 완전 독립적이며, 로컬변수 i := 0 이 실행됨
anotherInt := intSeq() // anotherInt 는 새로운 클로저로, 별도의 i 값을 유지합니다.
fmt.Println(anotherInt()) // 1 i값 기록있는 func() int { i++; return i }가 실행됨
fmt.Println(anotherInt()) // 2
}

intSeq()를 호출하면 i가 0으로 초기화된 상태로 익명 함수가 반환됩니다.

- nextInt 변수는 이 반환된 익명 함수를 참조합니다.

- nextInt는 i 값을 증가시키는 작업을 수행합니다.

nextInt()를 호출할 때마다 클로저 내부의 i가 증가하고 반환됩니다.

- 첫 번째 호출: i가 0에서 1로 증가 → 1 반환

- 두 번째 호출: i가 1에서 2로 증가 → 2 반환

- 세 번째 호출: i가 2에서 3으로 증가 → 3 반환

새로운 클로저를 생성하면 새로운 i가 초기화됩니다.

새로운 클로저를 생성하면 독립적인 상태를 가지는 새로운 변수를 생성합니다.

- anotherInt := intSeq()는 새로운 i를 생성하며, 값은 0으로 시작합니다.

- 이 클로저는 이전의 nextInt와 독립적으로 작동합니다.


Go 언어에서 클로저는 자신이 참조하는 변수(i)를 메모리에 유지합니다.

이 때문에 intSeq 내부의 i는 nextInt가 존재하는 한 메모리에서 유지되며, 호출 시마다 상태가 업데이트됩니다. (호출때마다 기록값이 있는 함수가(공식이) 작동합는 원리), 변수값에 return 되는 함수를 넣어두고 있는 개념.

---------------------------------------------------------------------------------------

func createAdder(x int) func(int) int {
return func(y int) int {
return x + y
}
}

createAdder 함수: 

- createAdder는 함수를 반환하며, 반환하는 함수는 정수(int)를 매개변수로 받고, 

   정수를 반환합니다.

- 매개변수: x int (정수형 x를 입력받음)

- 반환값: func(int) int


func(y int) int 익명 함수:

- 익명 함수 내부에서 입력받은 y와 외부에서 전달된 x를 더합니다

- return x + y: 클로저(closure)를 이용하여 x 값을 유지합니다


func main() {
add10 := createAdder(10) // x값 + 익명함수 = 변수 add10에 저장해둠
result := add10(5)
fmt.Println(result) // 출력: 15
}

createAdder 호출:

- createAdder(10)을 호출하면, 10을 더하는 함수를 반환합니다.

- 반환된 함수는 add10 변수에 저장됩니다 add10 := createAdder(10)


반환된 함수 호출:

- add10(5)를 호출하면, 반환된 함수의 내부 동작에 따라 10 + 5가 계산됩니다

   result := add10(5)


결과 출력:

- result 변수에 저장된 값을 출력합니다. 결과는 15입니다

- fmt.Println(result) // 출력: 15


package main

import (
"fmt"
)

// 두 수의 합을 계산하는 함수를 반환하는 함수
func createAdder(x int) func(int) int {
return func(y int) int {
return x + y
}
/* 아래와 같이, x값이 10으로 된 상태로, 아래 함수 내용이 add10 변수에 저장되는 원리
변수 호출시, 아래에 x값이 (고정 or 누적)적용된 리턴만 실행되는 원리.
return func(y int) int {
return 10 + y
}
*/
}

func main() {
// 10을 더하는 함수를 생성
add10 := createAdder(10) //add10은 x값 10과 함께 익명함수까지 통째로~ 기억합니다.
// add10을 사용하여 5를 더함
result := add10(5) // 변수에 5를 적용시, 리턴값에 y인자로 들어가, 10+5 =15
fmt.Println(result) // 출력: 15
}

createAdder가 호출되면, 매개변수 x에 값 10이 전달됩니다.

함수 내부에서 익명 함수 func(y int) int { return x + y }를 반환합니다.

반환된 익명 함수는 x = 10이라는 상태를 기억합니다.

간단하게 설명하면: x값 인자로 10을 받으면, x값 10은 계속 유지되고, add10(5)로 y값 5를 받으면,

10 + 5 = 15 가 됩니다.

* 클로저 내부에서 사용되는 변수는 함수가 선언된 환경(scope)에서 캡처된 상태로 저장됩니다.

  클로저에 의해 캡처된 변수는 스택이 아닌 힙에 저장됩니다. 일반 함수는 호출이 끝나면 메모리에서 제거되지만,

  createAdder 함수에서 x는 로컬 변수로 선언되지만, 반환된 익명 함수가 x를 참조합니다

  익명 함수가 x를 참조하는 순간, Go는 x를 힙 메모리에 복사하여 유지합니다.

  이후 반환된 함수는 힙에 저장된 x를 계속 사용할 수 있습니다.

  인자로 받은 x값과 익명함수를 한꺼번에 변수로 기억해두는 원리입니다.

* 힙 메모리에 할당된 클로저 변수는 자동으로 관리됩니다.

  Go의 가비지 컬렉션(GC)이 클로저 변수를 추적하고, 더 이상 참조되지 않는 경우 이를 자동으로 제거합니다.

  직접 힙 메모리에 할당된 변수를 제거할수는 없습니다.(참조하는걸 끊어두면, GO가 자동으로 제거합니다.)

  add10 = nil로 설정하면 클로저 함수에 대한 참조가 사라집니다.

  또는, { } 블록 안에서만 유효하기에, 블록을 벗어나면 참조가 사라져, 클로저는 제거됩니다.

  클로저 변수는, 전역변수로 저장하면 안됩니다. 프로그램이 종료 될때까지, 가비지 컬렉터가 제거하지 못해요.

  클로저를 slice나 map에 저장하면, 자료구조에서 해당 항목을 삭제하지 않는 한 클로저는 유지됩니다.


실행 순서:

createAdder 호출

- createAdder(10)은 익명 함수 func(y int) int { return x + y }를 반환하며, 

  x 값은 10으로 고정됩니다.

- 함수를 변수에 저장

  반환된 함수가 add10 변수에 저장됩니다.

- add10(5) 호출

  호출 시, y 값으로 5를 전달합니다.

  클로저를 통해 x 값(10)은 기억된 상태입니다.

  결과: 10 + 5 = 15

- 결과 출력

  fmt.Println을 통해 결과를 출력합니다.


클로저(Closure)란?

- 클로저는 함수가 외부 환경의 변수를 캡처하여 기억하는 기능입니다.

- createAdder에서 반환된 익명 함수는 x 값을 캡처하여 반환된 후에도 

   계속 사용할 수 있습니다.

   add10 := createAdder(10) // x는 10으로 고정됨

   fmt.Println(add10(5))    // 출력: 15 (x = 10, y = 5)

   fmt.Println(add10(20))   // 출력: 30 (x = 10, y = 20)







20250104

메서드를 검색하고 활용하는 방법 - golnag

 메서드를 검색하고 활용하는 방법 - golnag

- 구글에서 검색

  구글에서 검색할때, docs, documentation, API 같은 키워드와 함께 원하는 검색어 입력해야 정확함.

-Go패키지 웹싸이트에서 검색

- 패키지 웹싸이트의 검색창에서 설명 검색 

- linux 등의 터미널에서 docs 검색 

  [예제] go doc fmt

 - linux 등의 터미널에서 한글변환 docs 한줄씩 검색 방법

translate-shell 로 사용 방법
[설치] sudo apt install python3 python3-pip -y
[설치] sudo apt install translate-shell
[환경설정] export PATH=$PATH:~/.local/bin
[예제] go doc fmt | trans -b :ko


[검색된 메서드의 설명에서 체크할것들]

  입력값: 필요한 매개변수 타입과 의미 확인

  출력값: 반환 타입과 값의 의미 확인

          - 첫번째 반환값, 두번째 반환값.. 등을 확인 

  예제 코드 참고

  설명에 나오는 parameter, return, example 용어 잘 참고

  Parameter (매개변수)

  - Go 언어에서 매개변수는 함수가 호출될 때 전달받는 입력값을 받을 변수입니다.

    함수에 전달되는 입력값을 받는 변수 

    add(a int, b int)에서 a, b는 매개변수

  - 함수 정의 시 괄호 안에 선언되며, 호출할 때 실제 값(인수)이 이 매개변수에 전달됩니다.

  - 매개변수는 타입을 명시해야 합니다.(동일한 타입의 여러 매개변수는 1개로 생략가능)

  - 여러 개의 매개변수를 선언할 수 있으며, 같은 타입일 경우 타입을 생략할 수 있습니다.


  Return (반환값)

  - Go 언어에서 반환값은 함수가 실행 후 결과를 돌려주는 값입니다.

  - return 키워드를 사용하여 값을 반환합니다.함수 실행 결과로 반환되는 값

    참고: return a + b

  - 반환값은 0개, 1개 또는 여러 개일 수 있습니다.

  - 반환값의 타입도 함수 정의 시 명시해야 합니다.

  - 여러 개의 값을 반환할 때는 괄호로 묶습니다.

  - 반환값 이름을 지정하면 더 읽기 쉬운 코드 작성이 가능합니다.

    func square(num int) int {

        return num * num

     } // 에서 int { 괄호앞에 int가 반환값이며, 반환값의 이름 지정하면 알아보기 쉬움.


  Example (예제)

  - 함수 사용법을 보여주는 샘플 코드

  - 예제는 Go 언어의 함수나 기능을 어떻게 사용하는지 보여주는 코드입니다.

  - 일반적으로 문서화, 블로그, 튜토리얼 등에서 제공됩니다.

  - Go는 _test.go 파일을 통해 공식적으로 예제를 작성할 수 있습니다.

  - 예제는 코드의 동작 방식을 이해하기 쉽게 작성됩니다.

  - 표준 라이브러리 문서에서는 예제 코드가 함께 제공됩니다.

  - 테스트 파일 내의 Example 함수로 작성하면, go test로 예제를 실행하며 결과를 확인할 수 있습니다.


Go 언어에서 객체와 메서드 호출의 작동 원리 -golang

Go 언어에서 객체와 메서드 호출의 작동 원리


reader := bufio.NewReader(os.Stdin)

input, err := reader.ReadString('\n')


reader.ReadString('\n') 에서

- reader는 bufio.NewReader로 생성된 객체

- ReadString 은 메서드 라고 하고,  bufio.NewReader(os.Stdin) 객체에서 호출가능한 메서드임.



reader의 정의와 역할

reader := bufio.NewReader(os.Stdin)


bufio.NewReader(os.Stdin):

NewReader는 os.Stdin(표준 입력)에서 데이터를 읽기 위한 bufio.Reader 객체를 생성합니다.

반환된 객체는 *bufio.Reader 타입입니다.


reader:

- reader 변수는 *bufio.Reader 타입객체를 참조합니다.

- 이 객체에는 여러 메서드(ReadString, ReadBytes, ReadRune 등)가 정의되어 있어 호출이 가능합니다.


메서드 호출의 원리: reader.ReadString

객체의 메서드 정의

func (b *Reader) ReadString(delim byte) (string, error)

- ReadString은 bufio.Reader 타입에 정의된 메서드입니다

- (b *Reader)는 수신자(receiver)를 의미합니다.

- b *Reader는 포인터 리시버로 설정된 Reader 타입의 변수입니다.

  리시버: 메서드가 특정 타입에 속하게 만들어주는 역할

- 다른 곳에서 Reader 타입의 변수를 사용하면 .을 통해 ReadString 메서드를 호출할 수 있습니다.

- *Reader 타입의 객체(reader)가 있어야 ReadString 메서드를 호출할 수 있습니다.

- Reader 타입은 Go 표준 라이브러리에서 제공하는 데이터 스트림을 읽는 데 사용되는 타입

  1. 주로 io, bufio, 또는 strings 패키지에서 사용됨.

  2. 파일, 문자열, 네트워크 연결 등 다양한 데이터 소스를 읽을 수 있도록 추상화된 

인터페이스 또는 구조체를 가리킵니다.

  3. Reader 타입은- 구조체 타입(struct type) 또는 인터페이스 타입(interface type)입니다.

  4. Reader는, 기본 타입(int, string)처럼 단순히 값을 저장하는 것이 아니고

데이터를 읽는 동작을 정의하거나 구현한 구조체 또는 인터페이스 타입입니다.


메서드 호출 구문

input, err := reader.ReadString('\n')


reader.ReadString('\n'):

- reader는 *bufio.Reader 타입의 객체입니다.

- reader.ReadString('\n')처럼 메서드를 호출하면, 내부적으로 reader가 b *Reader에 바인딩됩니다.

- reader는 ReadString 메서드의 수신자(receiver) 역할을 합니다.

- ReadString 메서드가 호출되면 reader 객체가 func (b *Reader)에서 b로 전달됩니다.

메서드 호출을 분해하면 다음과 같이 동작합니다:

- reader는 *bufio.Reader 객체입니다.

- ReadString 메서드를 호출할 때 reader가 메서드의 수신자 b전달됩니다.

- ReadString 메서드는 reader의 내부 데이터를 처리해 결과를 반환합니다.


. (dot) 연산자의 역할

- 객체가 가진 메서드나 필드에 접근할 때 사용됩니다.

- 메서드 호출 시 객체는 자동으로 수신자로 전달됩니다.

reader.ReadString에서 . 연산자는 다음과 같은 역할을 합니다:

객체의 메서드 접근:

- reader 객체가 가진 메서드 중 ReadString 메서드를 찾습니다.

- Go 컴파일러는 reader의 타입인 *bufio.Reader를 확인하고, 해당 타입에 정의된 ReadString 메서드를 호출할 수 있음을 알아냅니다.

메서드 호출 시 객체 전달:

bufio.ReadString(reader, '\n')

- reader.ReadString('\n')을 호출하면, 내부적으로 위와 같이 동작합니다

- 즉, reader 객체가 메서드의 첫 번째 매개변수로 암묵적으로 전달됩니다.

변수이름 := bufio.NewReader(os.Stdin) // 변수 이름

input, err := 변수이름.ReadString('\n') // 변수이름 으로 메서드 호출


reader := bufio.NewReader(os.Stdin) // *bufio.Reader 객체 생성

      // bufio.NewReader 함수가 호출되어 새로운 *bufio.Reader 객체를 생성합니다.

      // reader 변수는 이 객체를 참조합니다.

      // reader는 *bufio.Reader 객체입니다.

fmt.Println("Enter text:")


input, err := reader.ReadString('\n') // reader 객체의 ReadString 메서드 호출

      // ReadString 메서드는 *bufio.Reader 타입에 정의된 메서드로, 객체에서 호출 가능합니다.

      // 호출 시 reader 객체가 메서드의 수신자로 전달됩니다.

      // reader 객체에서 ReadString 메서드를 호출합니다.

      // reader는 ReadString 메서드의 수신자로 전달됩니다.

      // delim 매개변수로 '\n'이 전달됩니다.


      // ReadString 메서드는 reader 객체의 내부 버퍼에서 데이터를 읽습니다.

      // 데이터는 '\n'이 나올 때까지 읽으며, 문자열로 반환합니다.

      // 읽은 문자열(input)과 에러(err)를 반환합니다.

if err != nil {

fmt.Println("Error:", err)

return

}


fmt.Println("You entered:", input)




20241230

스택 (Stack), 큐 (Queue) 에 대하여 - golang

스택 (Stack), 큐 (Queue) 에 대하여

-Stack 과 Queue 는 데이터를 저장하고 다루는 방식을 정하는 - 자료구조 입니다. 


스택 (Stack)

- 방식: 마지막에 들어간 것이, 먼저 나옵니다.(LIFO: Last ln, First Out)

           함수 호출 관리 및 역순 처리가 필요한 경우

추가 및 삭제는 한쪽 끝에서만.[데이터 복원등, Undo 등에 주로 사용]

- 접시에 음식을 쌓아 올리면, 맨 위에 맨 마지막에 올린것 먼저 먹게 되는 원리 

- 스택에 1, 2, 3을 순서대로 넣으면 꺼낼 때는 3, 2, 1 순서로 나옵니다.

stack := []int{} // 빈 스택, 슬라이스를 생성해 스택처럼 사용
// 슬라이스는 동적 배열로 크기가 유동적으로 변할 수 있어요.
// 값 넣기 (Push) append를 사용하여 값을 추가함.
// 계속 추가하면, 스택의 마지막 부분에 값이 쌓이는 형태가 됨.
stack = append(stack, 1) // 1을 스택에 추가, 기존 stack1을 추가한 새로운 슬라이스를 반환
stack = append(stack, 2) // 2를 스택에 추가
stack = append(stack, 3) // 3을 스택에 추가
fmt.Println("스택 상태:", stack) // [1, 2, 3]

// 값 꺼내기 (Pop)
for len(stack) > 0 {
n := stack[len(stack)-1] // 가장 위에 있는 값, 스택의 마지막 요소(값)를 가져옴
// len 함수는 슬라이스, 배열, 문자열, 맵, 채널 등의 길이나 크기를 반환 // 내장 함수이며- 길이나 개수를 알고 싶을 때 사용함.
stack = stack[:len(stack)-1] // 마지막 값(요소) 제거
// 마지막 요소를 제외한 슬라이스를 반환해 값을 꺼내는 효과
fmt.Println("꺼낸 값:", n) fmt.Println("현재 스택:", stack)
}


큐 (Queue)

- 방식: 먼저 들어간것이 먼저 나옵니다.(FIFO: First in, First Out)

            데이터를 순서대로 사용(처리)이 필요한 경우

추가는 뒤에서, 삭제는 앞에서. [CPU 및 대기열 및 이벤트 관리등에 사용]

- 그물방 채반안에, 과일을 씻기 위해, 물을 뿌리면, 먼저 들어간 물이 먼저 떨어지는 원리.

- 큐에 1, 2, 3을 넣으면 꺼낼 때는 1, 2, 3 순서로 나옵니다.

queue := []int{} // 빈 큐, 빈 슬라이스를 생성하여 큐로 사용

// 값 넣기 (Enqueue), append를 사용해 값을 추가, 추가된 값은 항상 큐의 맨 뒤에 위치
queue = append(queue, 1) // 1을 큐에 추가
queue = append(queue, 2) // 2를 큐에 추가
queue = append(queue, 3) // 3을 큐에 추가
fmt.Println("큐 상태:", queue) // [1, 2, 3]

// 값 꺼내기 (Dequeue)
for len(queue) > 0 {
n := queue[0] // 가장 앞에 있는 값, 큐의 첫 번째 값을 가져옴
queue = queue[1:] // 첫 번째 요소를 제외한 슬라이스를 반환해 값을 꺼내는 효과를 냄.
fmt.Println("꺼낸 값:", n) fmt.Println("현재 큐:", queue)
}


append 함수

-Go언에서 append는 슬라이스에 새 요소를 추가하는 내장 함수임.

- append는 슬라이스에 값을 추가하는 간단한 방법

- 큰 슬라이스에서 빈번히 append를 사용하면 성능에 영향을 줌(슬라이스의 용량이 부족하면 새 메모리 공간을 할당하고 데이터를 복사 하기에)

스택에서는 append로 값을 쌓고, 슬라이스의 마지막 요소를 꺼내 삭제.

- 에서는 append로 값을 줄 세우고, 슬라이스의 첫 번째 요소를 꺼내 삭제.

append 기본 사용법

slice := []int{1, 2}
slice = append(slice, 3) // [1, 2, 3]
// 기존 슬라이스 slice3을 추가한 새로운 슬라이스를 반환
// 기존 슬라이스는 변경되지 않고, 새로운 슬라이스가 생성되므로 반드시 대입해야 함.


append 다중 요소 추가- 여러 값을 한 번에 추가

slice = append(slice, 4, 5, 6) // [1, 2, 3, 4, 5, 6]


append 슬라이스 병합 - ...을 사용하면 다른 슬라이스의 모든 요소를 추가

otherSlice := []int{7, 8}
slice = append(slice, otherSlice...) // [1, 2, 3, 4, 5, 6, 7, 8]





20241227

Go언어의 IF 문, FOR 문 - Golang

Go언어의 IF 문, FOR 문


if문 - 조건이 맞으면 {} 블럭안 실행.( if는 특정 조건만 검사하는 경우에 적합함)
         단, '{' 시작하는 블럭이 if 문과 같은 라인에 있어야 함.
         c언어에서 사용하는 삼항 연산자(? :)를 사용할수 없슴(가독성을 위해서 지원하지 않음).
         조건식 ()가 필요없슴.- if문에는 소괄호가 필요가 없슴.
         Boolean 식으로만 표현 - 참(True) 또는 거짓(False)
         Boolean식은 논리 연산(&&, ||, !)이나 비교 연산(==, !=, <, >, <=, >=)에서 사용함.
         Boolean식은 조건문 if, for, switch 에서 주로 사용함.
         논리 판단: 특정 조건을 만족하는지 판단할 때 사용(크냐,작냐,같냐,다르냐,참이냐..)
         if문에 조건식 이전에, if문 안에서만 사용할수 있는 문장을 추가할수도 있슴.

for i := 0; i < 10; i++ { // for문: 0~9까지의 숫자안에서 루프해라.
if i%2 == 0 { // if문: 짝수만 출력해라
fmt.Println(i) // 출력: 2, 4, 6, 8
}
}

for문: i가 0일때 부터, i가 10보다 작을때 까지, i를 +1 하며, 루프
          숫자 0 부터, 9까지 루프로 체크 하고
if문: i를 2로 나눈 나머지값이 0과 같으려면, 짝수여야 하기에, 
       2,4,6,8 이 출력됩니다. 

if true {       // 참일때만 실행하는 if문
}
if false {       // 거짓일때만 실행하는 if문
}

if a == 1 {                   // a 가 1과 같으면, 참이면
    println("일")
} else if a == 2 {         // 1은 아니고, 만일 2와 같다면
    println("이")          // fmt 없이, println 소문자로 사용은, go의 기본 내장함수라서
} else {                       // else - 1도 2도 아닌 기타면
  fmt.Println("몰라")  // fmt없는 경우는, 디버깅 및 간단한 출력테스트만 권장함.
}                                 // fmt를 이용해서 출력시, Println함수에서 P는 대문자여야 함.
                                  // fmt의 함수를 이용한 출력을 go언어는 권장합니다.

if ok1 := i * 3; ok1 < ok2 {
fmt.Println(ok1)
}
      // if문에 조건식 이전에, if문 안에서만 사용할수 있는 문장을 추가할수도 있슴.
      // 위의 예제에서 ok1 은, if문을 벗어난 경우 에러가 발생됩니다. if문 안에서만 사용함.

FOR 문- Go언어에서 for 로 루프를 사용합니다.
for문은 반복작업을 표현하는데 주로 사용합니다. 반복과 조건을 사용하려면, for문을 사용함.
- 반복을 실행하며, 반복하는 중간에 조건을 평가할수도 있슴.(조건 평가는 if 문을 사용)
 
for i := 0; i < 10; i++ { //  for 초기값; 조건식; 후처리문(증감식) {} 블럭
}

            

for {       // 무한루프
}
for x := 1; true; x++ {       // 무한루프
}
for a < 50 {  //조건식
}

for 루프의 range 문은 슬라이스(slice), 맵(map), 배열(array), 문자열(string), 채널(channel) 등의 데이터를 순회(iterate)할 때 사용됩니다.

for index, value := range collection {
// 반복할 코드
}

index: 현재 반복의 인덱스 (또는 ).
value: 현재 반복의 .
collection: 순회하려는 데이터 구조.

슬라이스 순회
nums := []int{10, 20, 30, 40}
for index, value := range nums {
fmt.Printf("인덱스: %d, 값: %d\n", index, value)
}

결과: 인덱스: 0, 값: 10 
         인덱스: 1, 값: 20 
         인덱스: 2, 값: 30 
         인덱스: 3, 값: 40

맵순회
fruits := map[string]string{"a": "apple", "b": "banana", "c": "cherry"}
for key, value := range fruits {
fmt.Printf("키: %s, 값: %s\n", key, value)
}
결과:    키: a, 값: apple
            키: b, 값: banana
            키: c, 값: cherry

문자열 순회
str := "안녕"
for index, char := range str {
fmt.Printf("인덱스: %d, 문자: %c\n", index, char)
}
인덱스는 바이트 기준입니다. 한글처럼 UTF-8로 인코딩된 문자는 바이트 단위로 계산됩니다
결과:    인덱스: 0, 문자: 안
            인덱스: 3, 문자: 녕

값만 사용하기 (_를 활용)
nums := []int{10, 20, 30, 40}
for _, value := range nums {
fmt.Println(value)
}
결과:      10
              20
              30
              40

인덱스만 사용하기
값이 필요 없으면 _를 사용해 생략할 수 있습니다.
nums := []int{10, 20, 30, 40}
for index := range nums {
fmt.Println(index)
}

결과:       0
               1
               2
               3

range는 슬라이스, 맵, 문자열, 배열 등을 순회할 때 사용합니다.
필요하지 않은 값이나 인덱스는 _를 사용해 생략할 수 있습니다.
range는 Go 코드에서 데이터를 반복 처리할 때 가장 직관적이고 간단한 방법입니다.

For 문을 if 문처럼 사용하는 경우
for condition { // if와 비슷하게 동작
fmt.Println("조건이 참입니다!")
break // 조건이 참이더라도 반복하지 않도록 종료
}

For 문으로 조건 처리 하는 방법 
a, b, c := 5, 5, 1

for a == b && c == 1 { // 조건이 참일 때만 실행
fmt.Println("조건이 만족됩니다!")
break // 무한 루프를 방지하기 위해 추가
}


a, b, c := 5, 5, 1

for a == b && c <= 3 {
if c == 2 {
fmt.Println("조건 c == 2: 다음 반복으로 넘어갑니다.")
c++
continue // c == 2일 때 아래 코드 실행을 안하고, 다시 조건을 체크하로 감.
}

fmt.Printf("현재 c의 값: %d\n", c)
c++
}

fmt.Println("반복 종료")

continuebreak의 차이
continue: 현재 반복을 건너뛰고 다음 반복으로 이동.
                 continue 가 실행되면, 반복을 다시 시작 체크함.
                 continue 다음의 내용은 적용 안되고, 다시 반복을 체크하로 감.
break: 반복문을 완전히 종료.
            break 가 실행되면, 그 조건문(if. for)을 빠져 나감.
a, b, c := 5, 5, 1

for a == b && c <= 5 {
if c == 3 {
fmt.Println("c == 3: 반복을 완전히 종료합니다.")
break // 반복문 종료- 조건문을 완전히 빠져 나감
}

if c == 2 {
fmt.Println("c == 2: 다음 반복으로 넘어갑니다.")
c++
continue // 다음 반복으로 건너뜀-아래 조건은 실행 안하고, 다시 조건 체크로 이동
}

fmt.Printf("현재 c의 값: %d\n", c)
c++

c++ 과 ++c 차이점
c++ = (후위 증가 연산자), 변수 c의 값을 먼저 사용하고, 그 다음에 1을 증가시킴
int c = 5;
int result = c++; // result에 5가 저장되고, c는 6이 됩니다.
먼저 사용한 다음에 증가를 합니다.

++c = (전위 증가 연산자), 변수 c의 값을 먼저 1 증가시키고, 그 증가된 값을 사용함.
int c = 5;
int result = ++c; // c는 6이 되고, result에 6이 저장됩니다.
먼저 증가를 시키고, 사용을 합니다.

c = c + 1
int c = 5;
c = c + 1; // c는 6이 됩니다.
값에 1을 더하고, 다시 할당합니다. 증가만 시킵니다.







20241226

Go언어의 연산자 관련- Golang

Go언어의 연산자 

- 산술연산자, 관계연산자, 논리연산자, Bitwise연산자, 복합할당연산자, 포인터연산자


산술연산자: 

-사칙연산자: 더하기, 빼기,곱하기, 나누기, 나머지 등 숫자 계산에 사용됩니다.

      + 더하기

      - 빼기 

      * 곱하기 

      / 나누기(몫) 

      % 나누기(나머지)

-증감연산자: 

      ++  : 변수에 1 증가 개념. i++    //   (i = i + 1)    복합할당연산자로 표시시 (i += 1)

      -- : 변수에 1 감소 개념. i--       //    (i = i -1)     복합할당연산자로 표시시 (i -= 1)


관계연산자: 값을 비교할때 사용합니다. 같다, 크다, 작다, 다르다

      ==  같다

      !=  다르다

      <  작다

      > 크다 

      >= 크거나 같다

      <= 작거나 같다


논리연산자: 참(true),거짓(false) 계산에 사용함.

      AND, && = 둘다 참이면 참(그리고 개념)

      OR, || = 둘중에 하나만 참이어도 참(또는 개념)

      NOT, ! = 다르면 참(부정 개념, 참이면 거짓이고, 거짓이면 참)


Bitwise연산자: 비트를 조작할때 사용합니다.

      & : AND 개념( 둘다 1이면 1)

      | : OR 개념( 둘중에 하나만 1이면 1)

      ^ : XOR 개념(둘이 다르면 1)

      << : 왼쪽으로 비트 이동 ( 2의 제곱 곱하기)

             비트를 왼쪽으로 밀고, 빈자리를 0으로 채웁니다.

             숫자를 2의 제곱으로 곱하는 것과 같음 ( *2, *4, *6, *8...)

              2진수는 8개 자리로 00000000~11111111 이며, 8비트 2진수의 표시입니다.

              8비트의 2진수는 0과 1로 이루어진 8자리 숫자입니다.

             a := 2          // 2를 2진수로 나타내면 00000010

             b := a << 1     // 왼쪽으로 1칸 이동: 00000100 (10진수로 4) = 2 * 2 = 4

             c := a << 2     // 왼쪽으로 2칸 이동: 00001000 (10진수로 8) = 2 * 2 * 2 = 8

             fmt.Println(b)  // 출력: 4

             fmt.Println(c)  // 출력: 8


      >> : 오른쪽으로 비트 이동 (2의 제곱 나누기)

             비트를 오른쪽으로 밀고, 빈자리를 0으로 채웁니다.(양수일때)

             숫자를 2의 제곱으로 나누는 것과 같음. ( /2, /4, /6, /8...) 

             a := 8          // 8을 2진수로 나타내면 00001000

             b := a >> 1     // 오른쪽으로 1칸 이동: 00000100 (10진수로 4) = 8 / 2 = 4

             c := a >> 2     // 오른쪽으로 2칸 이동: 00000010 (10진수로 2) = 8 / 2 / 2 = 2

             fmt.Println(b)  // 출력: 4

             fmt.Println(c)  // 출력: 2


복합 할당연산자

= : 값을 대입하는 것

+=  : 값을 더해서 대입하는 것

-= : 값을 빼서 대입하는 것

*= : 값을 곱해서 대입하는 것

/= : 값을 나눠서 대입하는 것

%= 값을 나눈 나머지를 대입하는 것


포인터연산자: 포인터와 관련된 연산자 입니다.

& : 변수의 메모리 주소를 할당(가져오기)

* : 메모리 주소의 값을 가져오기(가리키는 주소에 실제 값 사용)

- 포인터에 더하고,빼는 기능이 없습니다.(안정성 강화 및 코드 가독성을 위하여- 기능 없슴)

- 만일, 포인터에 더하고, 빼는 기능이 필요하다면(슬라이스, 정수인덱스로 대체할수 있슴)



20241224

Fatalf 에러 위치, Log 체크 - Golang

Log 체크 방법으로, 에러 위치 체크 방법- Fatalf

- 프로그래밍 하다 보면, 가끔 어디서 오류가 났나, 데이타가 잘 전달 되었나, 체크하고 싶을때, 메시지 팝업이나, Log 체크를 할 경우, Fatalf 를 사용시 편리할거 같아서 기록합니다.

- 에러를 보고하고, 프로그램을 종료합니다.

log.Fatalf는 포맷 문자열을 지원하는 log 함수입니다.

- 여러 변수를 추가하고, 출력할수 있습니다.

- log.Fatal은 에러만 보고합니다.

- import "log" // log 패키지가 필요합니다.

%v 기본 형식 출력 log.Fatalf("%v", err)

%s 문자열 출력 log.Fatalf("%s", fname)

%d 정수 출력 log.Fatalf("%d", Number)

%f 실수 출력 log.Fatalf("%f", pi)

%t Boolean 출력 log.Fatalf("%t", isErr)

%+v 상세한 구조체 출력 log.Fatalf("%+v", myStruct)

log.Fatalf("%v: 이런 문제로 여기쯤 에러 발생", aaa변수)

log.Fatal(fmt.Sprintf("%v: 여기쯤 값이 이러네", err))

 Sprintf- 문자열 출력말고, 포맷팅을 위해 사용되는 Go의 내장 함수- 포맷팅된 문자열을 반환

 예제]  result := fmt.Sprintf("이름: %s, 나이: %d", name, age)


%s 문자열 "Hello""Hello"

%d 10진수 정수 42"42"

%f 부동소수점 실수 3.14"3.140000"

%.nf n 자리까지 소수점 제한 3.14159"3.14" (%.2f)

%t 불리언 true"true"

%v 기본 형식 (기본값 출력) 123"123"

%+v 필드 이름 포함 (구조체 )

%#v Go 구문으로 표현

%T 값의 타입 출력 "Hello""string"

%% 퍼센트 기호 출력 (%) "%%""%"


log.Fatal(err) //에러 보고하고 프로그램 종료함.

exit status 1  // 항상 종료 코드로 1을 반환 합니다. 

os.Exit
-일반적으로 비정상 종료 exit status 1 (Error)상태를 나타냅니다. 
- 0 은 정상 종료를 의미합니다.
- 1 은 비정상 종료를 의미합니다. 
- 종료 상태 코드는 프로그램이 실행 마치고, 운영 체제에 반환하는 숫자 값입니다.
- 프로그램의 성공/실패 여부를 확인하는대도 사용됩니다.
- exit status 1은 프로그램 실행 중에 오류가 발생하거나, 프로그램이 예상치 못한 상황에서 종료되었음을 나타냅니다.
- log.Fatal은 에러 메시지를 출력한 후 os.Exit(1)을 호출하여 프로그램을 종료합니다.
- os.Exit(1) 직접 호출시: os.Exit 함수는 프로그램을 종료하고 지정된 상태 코드를 반환합니다.
- Go에서 종료 상태 코드를 제어하려면 os.Exit 함수를 사용합니다.

반환 값이 2개 인경우 무시하기 : _
input, _ := reader.ReadString('\n')

반환 값이 2개 인 경우 err 반환값을 변수로 저장하기
input, err := reader.ReadString('\n')
함수나 메서드는 - 문제가 없으면 에러값으로 nil을 반환합니다.
- err 값이 nil 이면, 문제가 없는것이고,
- err 값이 nil 아니면, 에러가 발생된 것임.
  if err != nil {                 // 에러가 nil 이 아니면(에러가 발생했으면)
           log.Fatal(err)     //에러 보고후, 프로그램 종료함.
  }


20241223

상수(const) 관련 -golang

상수(const) 관련 -golang


상수(const)는 
- 값이 변경되지 않는(값 변경불가), 이름을 가진, 고정된 값을 정의할 때 사용.
- 코드의 가독성을 높임.
- const 키워드를 사용하여 상수를 선언합니다.
- 의도치 않은 값 변경을 방지.
- 컴파일 시간에 값을 고정시키는 데 유용함.

상수 선언 방법:  const 상수이름 = 값
                         const키워드 상수이름 타입 = 값
                         const okok int = 2
                         const okok = 2 // 정수를 할당하고 있기에, 자동으로 상수는 int가 됨.
                                                  // 이것을 자동 타입 추론이라고 합니다.
여러 상수들을 묶어서 선언 방법:
                        const (
                             aaaa = "okok"
                             bbbb = "okbari"
                        )

상수값을 0 부터 순차적으로 자동 부여 방법: iota 사용
                         const (
                             aaaa = iota          // 0
                             bbbb                   // 1
                             cccc                    // 2
                        )                       

상수는 선언 후 값을 변경할 수 없다.
const Pi = 3.14
Pi = 3.14159 // 오류 발생- 값을 변경하여 오류가 발생함.

상수는 명시적으로 타입을 지정하거나 생략할 수 있다.
const A int = 10   // const키워드 상수이름 타입 = 값, 타입 지정
const B = 20       // const 상수이름 = 값, 타입 생략 (컴파일러가 타입 추론)

상수의 값은 반드시 컴파일 시간에 결정되어야 합니다.
const A = 1 + 2    // 가능 (컴파일 시간에 계산됨)
                            // 상수는 컴파일 시간에 값을 계산하고 고정해야 함.
                            // 
var B = 3             //var로 선언된 변수는 런타임에 값을 할당받거나 계산
                            // 컴파일러는 var 변수의 값을 실행 전에 알 수 없습니다.
const C = A + B    // 오류 (B는 런타임에 결정됨)
                             // const는 반드시 타입과 값이 컴파일러가 알 수 있는 상태여야 하며,
                             // 런타임 값과 연관될 수 없습


슬라이스, 맵, 구조체 같은 복합 데이터 타입은 상수로 선언할 수 없음.
const Array = []int{1, 2, 3} // 오류 발생

문자열도 상수로 선언할 수 있음.
const hiing = "Hello, World!"

숫자 상수는 명시적 변환 등을 통해 유형이 지정되기 전까지는 유형이 없슴.
const num = 42 // 타입이 없는 숫자 상수
var a int = num       // int로 변환

iota는 상수 블록에서 각 상수에 대해 순차적으로 증가하는 정수를 제공하기에,
열거형이나 비트 마스크를 쉽게 정의할 수 있어요.
const (
    Read    = 1 << iota  // 1 (2^0)
    Write               // 2 (2^1)
    Execute             // 4 (2^2)
)
fmt.Println(Read, Write, Execute) // 출력: 1 2 4





Go 도구 및 명령어 -Golang

Go 명령어

bug         start a bug report

Go 언어의 문제를 보고하기 위한 명령어. 

Go 프로젝트의 공식 GitHub 저장소에 버그 리포트를 시작할 수 있는 템플릿 웹페이지를 엽니다.

사용방법: go bug

               웹페이지가 열리고, 버그리포트 할수 있슴.


build       compile packages and dependencies

패키지와 그 의존성을 컴파일하여 실행 파일을 생성.

현재 디렉토리에, 실행파일(바이너리) 생성됨.

사용방법: go build [패키지]

               go build main.go

clean       remove object files and cached files

컴파일된 객체 파일 및 캐시 파일을 삭제

-cache: 빌드 캐시 삭제.

-testcache: 테스트 캐시 삭제.

사용방법: go clean


doc         show documentation for package or symbol

패키지나 심볼에 대한 문서를 표시(궁금하면 도움말을 검색할수 있는 기능)

사용방법: go doc [패키지 또는 심볼]

               go doc fmt.Println  //fmt.Println 관련 설명 도움말이 표시됩니다.

env         print Go environment information

현재 Go 환경 변수 값을 출력

- 여러 환경 변수 리스트가 출력됨.

사용방법: go env


fix         update packages to use new APIs
코드를 최신 API로 업데이트
사용방법: go fix [패키지]

fmt         gofmt (reformat) package sources

Go 코드를 포맷. 코드 스타일을 일관되게 유지할 때 사용

- 들여쓰기 및 공백 정리

- 불필요한 괄호 제거

- 코드 스타일 일관성 유지

사용방법: go fmt [패키지]

               go fmt hello.go   컴파일 전에 한번 실행해주면, 코드가 정리되서 아주 좋음.

               go fmt ./...      현재 디렉토리의 모든 Go 파일을 포맷팅 방법


generate    generate Go files by processing source

주석에 포함된 명령을 처리하여 Go 소스 파일을 생성

사용방법: go generate [패키지]

               주석 //go:generate를 포함한 명령을 실행


get         add dependencies to current module and install them

현재 모듈에 의존성을 추가하거나, 외부 패키지를 다운로드

사용방법: go get [패키지]

               go get github.com/aaaa/bbbb

install     compile and install packages and dependencies

패키지를 컴파일하고, 실행 파일을 설치 경로에 복사

설치버젼 만드는 방법임.

사용방법: go install [패키지]


list        list packages or modules

패키지 또는 모듈 목록을 표시

사용방법: go list [패키지]


mod         module maintenance

Go 모듈 관리 명령어. 모듈 초기화, 정리 등을 수행

사용예제: go mod init [모듈 이름]

               go mod tidy


work        workspace maintenance

워크스페이스(workspace)를 관리하기 위한 명령어

워크스페이스는 여러 모듈을 한꺼번에 관리하고 개발 환경에서 함께 작업할 수 있도록 설정을 제공

-워크스페이스를 사용하면 모듈을 통합 관리할 수 있슴.

-여러 모듈을 별도의 리포지토리로 관리하지 않고, 하나의 워크스페이스에서 개발 가능

-워크스페이스 내에서 모듈 간 변경사항을 실시간으로 반영 가능

-모든 모듈을 한 번에 테스트 가능

여러 모듈을 동시에 개발하거나, 모듈 간 의존성을 더 쉽게 처리하려는 경우에 유용

워크스페이스는 go.work 파일로 정의되며, 워크스페이스에 포함된 모듈 경로와 Go 환경을 정의함.

워크스페이스는 주로 로컬 개발 환경에서 사용되며, 배포 시에는 각 모듈을 독립적으로 관리해야함.

사용방법:

                 go work init [모듈 경로...]

                 go work init ./module1 ./module2

                 ./module1./module2가 포함된 워크스페이스가 생성됨.

                 새로운 워크스페이스를 초기화하고, 현재 디렉토리에 go.work 파일을 생성


                 go work use [모듈 경로...]

                 go work use ./module3

               ./module3이 워크스페이스에 추가됨.

                 기존 워크스페이스에 새로운 모듈을 추가됨.

                 go work drop [모듈 경로...]
                 워크스페이스에서 특정 모듈을 제거함.
                 go work drop ./module2
                 ./module2이 워크스페이스에서 제거됨.

                 go work edit [옵션]
                 go work edit -fmt
                go.work 파일의 포맷이 자동으로 정리
                go.work 파일을 수동으로 편집하지 않고 명령어를 통해 수정할 수 있슴.

               go work sync
                 워크스페이스 내 모듈의 상태를 동기화함.
                 워크스페이스 내 모든 모듈이 올바르게 동작하도록 의존성을 조정함.

run         compile and run Go program

Go 코드를 컴파일하고 실행

주로 테스트에 사용함. 임시로 컴파일하고 실행되고, 종료시 지워짐.

사용방법: go run main.go


test        test packages

Go 테스트 파일(*_test.go)을 실행

사용방법: go test [패키지]


tool        run specified go tool

Go에서 제공하는 특정 도구를 실행

사용방법: go tool [도구 이름]


version     print Go version

현재 설치된 Go의 버전을 출력

사용방법: go version


vet         report likely mistakes in packages

코드를 분석하여 잠재적인 문제를 보고함
사용방법: go vet [패키지]


추가 도움말:

buildconstraint      build constraints
특정 조건에서만 파일을 빌드하도록 제어하는 주석 구문
실행 예제: // +build windows

buildmode       build modes
Go 프로그램 빌드 시 사용할 빌드 모드를 지정

c               calling between Go and C
C와 Go 간의 호출(cgo)에 대한 설명

cache           build and test caching
빌드 및 테스트 캐싱 동작에 대한 설명

environment     environment variables
Go와 관련된 환경 변수 정보

filetype        file types
Go 파일의 유형에 대한 설명

go.mod          the go.mod file
Go 모듈 정의 파일의 역할과 사용법

gopath          GOPATH environment variable
GOPATH의 구조와 사용법

goproxy         module proxy protocol
모듈 프록시 설정에 대한 정보

importpath      import path syntax
패키지를 임포트하는 경로 구문

modules         modules, module versions, and more
Go 모듈의 구조와 사용법

module-auth     module authentication using go.sum
go.sum 파일을 통한 모듈 인증 방법

packages        package lists and patterns
패키지 목록과 패턴

private         configuration for downloading non-public code
비공개 코드를 다운로드하는 설정

testflag        testing flags
테스트 시 사용할 플래그 설명

testfunc        testing functions
테스트 함수 작성법

vcs             controlling version control with GOVCS
GOVCS로 버전 제어 관리