본문 바로가기
인턴/준비

Go Language #2

by 사향낭 2023. 1. 6.

참고로 얘 이름은 Gopher / Golang 사용자들을 Gopher라 부른다.

 

module import 문제가 있어서 Go를 조금 더 심도있게 공부해야겠다는 생각이 들었다.

(그냥 module 버전 문제였던 것 같은데 왜 이런 현상이 발생했는지는 의문이다.)

 

손대기 싫었는데.. 공식문서 스타트

 

 

Get started with Go

 

Tutorial: Get started with Go - The Go Programming Language

Tutorial: Get started with Go In this tutorial, you'll get a brief introduction to Go programming. Along the way, you will: Install Go (if you haven't already). Write some simple "Hello, world" code. Use the go command to run your code. Use the Go package

go.dev

 

module vs package (https://stackoverflow.com/questions/61940117/go-modules-vs-package)

 

Go는 코드를 작성하며 외부 module의 package를 사용할 때 dependency를 추적하고 관리해주는 dependency tracking 기능을 가지고 있다.

(그리고 이 dependency 정보는 go.mod 파일 안에 저장된다.)

 

개발중인 module 폴더 안에서 다음 명령어를 사용하면 go.mod 파일이 생성된다.

go mod init example/hello

 

만약 module을 배포할 생각이 있다면 'github.com/mymodule' 과 같이 module path를 repository location으로 설정해주면 다른 사람들이 Go tool을 이용해 쉽게 다운로드 받을 수 있다.

 

만약 외부 module을 추가했다면 다음 명령어로 새로운 module requirement를 손쉽게 더해준다.

go mod tidy

 

※ go.sum 파일은 module의 직간접적인 dependencies의 암호화된 hash를 저장하는데 module을 다운로드 받을 때 그들의 hash와 비교할 때 사용된다.

 

Go Modules Reference - The Go Programming Language

 

go.dev

 

 

Create a Go module

 

Tutorial: Create a Go module - The Go Programming Language

Tutorial: Create a Go module This is the first part of a tutorial that introduces a few fundamental features of the Go language. If you're just getting started with Go, be sure to take a look at Tutorial: Get started with Go, which introduces the go comman

go.dev

 

Go code는 package로 그룹화되고 package들은 module로 그룹화된다.

 

module은 Go version, 다른 module의 집합과 같이 code를 돌리기 위한 dependency를 명시한다.

 

Go에서 대문자로 시작하는 function 이름은 외부 package에서 사용가능하다.

(이를 exported name이라 한다.)

 

 

Call your code from another module

 

Call your code from another module - The Go Programming Language

Call your code from another module In the previous section, you created a greetings module. In this section, you'll write code to make calls to the Hello function in the module you just wrote. You'll write code you can execute as an application, and which

go.dev

 

local에 위치한 module을 import하려고 할 때 relative path로 module을 import 하는 것은 Go에서 지원하지 않는다.

 

하지만 이를 해결할 수 있는 트릭이 있는데 import 하려는 module명을 그대로 쓴 뒤 다음과 같은 명령어로 그 경로를 바꿔준 후 코드에 쓰인 module과 go.mod 파일을 syncronization 해준다.

go mod edit -replace MODULE_NAME=RELATIVE_PATH_OF_THE_MODULE_FOLDER
go mod tidy

 

go.mod 파일은 다음과 같이 변한다.

module example.com/current_module

go 1.16

replace MODULE_NAME => RELATIVE_PATH_OF_THE_MODULE_FOLDER

require MODULE_NAME v0.0.0-00010101000000-000000000000

 

이 과정을 통해 외부 local module을 사용한 코드를 정상적으로 실행시킬 수 있다.

 

배포된 module은 syncronization만 하면 된다.

(만약 오류가 발생한다면 path를 명확히 적어주면 해결할 수 있지 않을까?)

 

 

Return and handle an error

 

Return and handle an error - The Go Programming Language

Return and handle an error Handling errors is an essential feature of solid code. In this section, you'll add a bit of code to return an error from the greetings module, then handle it in the caller. Note: This topic is part of a multi-part tutorial that b

go.dev

 

Go는 error를 type의 일종으로 보기 때문에 error handling을 조건문을 통해 해주면 된다.

 

개인적인 추측으로는 굳이 try & catch같은 keyword를 넣지 않고 언어를 좀 더 compact하게 만들고자 하는 Go 창시자들의 정신이 담겨있는 것이 아닐까 싶다.

(try & catch와 if 문은 기능적으로 다를 것이 없지 않나?)

 

error는 다음과 같이 생성한다.

e := errors.New("My ERROR NAME") // "error" type

 

일반적으로 error 없이 성공적으로 코드가 실행될 때에는 nil (no error)을 사용한다.

 

 

Return a random greeting

 

Return a random greeting - The Go Programming Language

Return a random greeting In this section, you'll change your code so that instead of returning a single greeting every time, it returns one of several predefined greeting messages. Note: This topic is part of a multi-part tutorial that begins with Create a

go.dev

 

프로그램이 실행될 때 Go는 자동으로 init (이라는 이름을 가진) function을 실행한다.

(initialization을 위한 main같은 느낌)

 

Go는 slice라는 type을 지원하는데 python의 list, cpp의 vector와 비슷하다고 보면 된다.

(가변 array? 물론 디테일에 차이가 있다)

s := []string{} // empty string slice

 

rand.Seed(), rand.Intn(), time.Now() 등의 함수를 사용해보았다.

(다른 언어들과 비슷하다)

 

 

Return greetings for multiple people

 

Return greetings for multiple people - The Go Programming Language

Return greetings for multiple people In the last changes you'll make to your module's code, you'll add support for getting greetings for multiple people in one request. In other words, you'll handle a multiple-value input, then pair values in that input wi

go.dev

 

array에 대해 loop를 돌 때 range keyword는 array의 index와 element를 iteration 한다.

 

만약 index가 필요없다면 Go blank identifier인 _(underscore)로 이를 무시할 수 있다.

(Go에서는 쓰지 않는 변수가 있다면 compile error가 발생함)

 

아래와 같이 map을 만들 수 있다.

m := make(map[string]int)

 

 

Add a test

 

Add a test - The Go Programming Language

Add a test Now that you've gotten your code to a stable place (nicely done, by the way), add a test. Testing your code during development can expose bugs that find their way in as you make changes. In this topic, you add a test for the Hello function. Note

go.dev

 

Go는 unit test를 위한 built-in module을 지원한다.

 

go test command는 파일 이름 + _test.go 파일을 실행시켜 test를 진행한다.

 

만약 greetings.go 파일을 testing하는 test code를 작성하고 싶다면 greetings_test.go 파일을 만들어 내용을 채워넣은 뒤 go test command를 입력한다.

// greetings_test.go
package greetings

import (
    "testing"
    "regexp"
)

// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
func TestHelloName(t *testing.T) {
    name := "Gladys"
    want := regexp.MustCompile(`\b`+name+`\b`)
    msg, err := Hello("Gladys")
    if !want.MatchString(msg) || err != nil {
        t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
    }
}

// TestHelloEmpty calls greetings.Hello with an empty string,
// checking for an error.
func TestHelloEmpty(t *testing.T) {
    msg, err := Hello("")
    if msg != "" || err == nil {
        t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
    }
}
go test

 

Test 함수의 이름은 TestName 형식을 가지며 parameter로 testing.T type의 포인터를 받는다.

 

이 parameter를 가지고 test에 대해 reporting이나 logging을 한다.

 

go test -v로 어떤 함수가 성공했는지 상세한 정보를 확인할 수 있다.

 

 

Compile and install the application

 

Compile and install the application - The Go Programming Language

Compile and install the application In this last topic, you'll learn a couple new go commands. While the go run command is a useful shortcut for compiling and running a program when you're making frequent changes, it doesn't generate a binary executable. T

go.dev

 

build 하기 원하는 폴더에 다음 명령어로 executable file을 만들 수 있다.

go build

 

go install command는 excutable file을 GOBIN 변수에 설정된 path에 저장한다.

go list -f '{{.Target}}'
go env -w GOBIN=INSTALL_PATH
go install

'인턴 > 준비' 카테고리의 다른 글

What is a REST API  (0) 2023.01.07
Git #4 Branching  (0) 2022.12.31
Git #3 Revert, reset and restore  (0) 2022.12.30
Git #2 Basics  (1) 2022.12.29
Git #1 Origins story and terms  (0) 2022.12.27

댓글