Programming Language/golang 12

Redis-go를 interface화 하여 사용하기

golang에서 Redis를 사용할 때는 보통 go-redis 라이브러리를 많이 사용합니다. 이 때, 바로 메서드를 사용하기 보다는 내부 비즈니스 로직이 포함된 RedisClient 인터페이스를 만들어 사용하곤 하는데요. 아래는 그 예시 입니다. redis.go package main import ( "context" "fmt" "github.com/go-redis/redis/v8" // go-redis import ) // RedisClientInterface 인터페이스 정의 type RedisClientInterface interface { Set(key string, value interface{}) error Get(key string) (string, error) } // RedisClient ..

json value가 null일때 golang은 Unmarshal을 잘 할 수 있을까?

golang은 JSON Format 데이터를 struct로 변환할 수 있는데 이것을 Unmarshal이라고 부릅니다. 예를 들어 다음과 같은 함수로 구현될 수 있습니다. func getStructFromJSON(jsonData string, valuePtr interface{}) error { return json.Unmarshal([]byte(jsonData), valuePtr) } jsonData : json포맷으로된 String 데이터 valuePtr : struct타입 예를 들어 다음과 같이 호출할 수 있습니다. type SampleStruct struct { A int32 `json:"a"` B int32 `json:"b"` } func main() { var valuePtr SampleStru..

map[string]interface 데이터를 avro 포맷으로 파일 저장하는 방법

package main import ( "encoding/json" "fmt" "github.com/linkedin/goavro" "os" "time" ) func main() { // Avro 스키마 정의 schemaJSON := `{ "type": "record", "name": "Example", "fields": [ {"name": "username", "type": "string"}, {"name": "age", "type": "int"} ] }` codec, err := goavro.NewCodec(schemaJSON) if err != nil { panic(err) } // 파일 생성 file, err := os.Create("avro_data.avro") if err != nil { pan..

golang struct type을 JSON으로 Print 하기

package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int } func main() { myStruct := Person{"dvwy", 145} fmt.Println("=======") fmt.Println(myStruct) fmt.Println(prettyPrint(myStruct)) } func prettyPrint(i interface{}) string { s, _ := json.MarshalIndent(i, "", "\t") return string(s) } 결과는 다음과 같습니다. {dvwy 145} { "Name": "dvwy", "Age": 145 } 출처 : https://stackoverflo..

golang prviate repository에서 디펜던시 가져오는 방법

golang private repository를 하위 모듈로 가져올 때 그냥 import를 실행하고 나면 다음과 같은 이슈가 종종 발생하곤합니다. $ go get github.com/AndersonChoi/my-private-repo go: downloading github.com/AndersonChoi/my-private-repo v0.0.0-20230306053459-dec1333da9d3 go: github.com/AndersonChoi/my-private-repo@v0.0.0-20230306053459-dec1333da9d3: verifying module: github.com/AndersonChoi/my-private-repo@v0.0.0-20230306053459-dec1333da9d3: re..

goroutine 함수 여러번 실행 결과값 기다리는 2가지 방법 - js callback 처럼

WaitGroup을 사용하는 방법 1) sync.WaitGroup을 사용하여 대기 2) go func 사용하여 goroutine 함수 호출 위 2가지 방법을 사용하면 여러번 실행된 결과값을 병렬 처리한 뒤 한개의 결과값으로 추출할 수 있습니다. 예제 코드는 다음과 같습니다. package main import ( "fmt" "math/rand" "strconv" "sync" "time" ) func main() { result := 0 count := 10 var wg sync.WaitGroup // WaitGroup 선언 wg.Add(count) // Wait 개수 지정 for i := 1; i

go gin framework graceful shutdown 예제

https://gin-gonic.com/docs/examples/graceful-restart-or-stop/ Graceful restart or stop Do you want to graceful restart or stop your web server? There are some ways this can be done. We can use fvbock/endless to replace the default ListenAndServe. Refer issue #296 for more details. router := gin.Default() router.GET("/", handler) // [...] end gin-gonic.com gin은 golang에서 많이 쓰이는 웹프레임워크입니다. graceful..

intellij에서 golang 프로젝트 인식이 잘 안될때

intellij에서 golang을 최초로 실행 시키고 난뒤에 $ go mod init myapplication 프로젝트가 정상적으로 라이브러리들을 Import시키지 못할 때가 있습니다. 그럴 경우에는 cmd + , 를 눌러서 Preferences로 간 뒤 Go Modules의 Enable Go modules integration을 체크하면 싱크됩니다. 싱크가 완료된 go.mod 파일 모습 module myapplication go 1.19 require ( github.com/gin-gonic/gin v1.9.0 github.com/prometheus/client_golang v1.14.0 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.co..

golang 동시성 예제

golang은 동시성 프로그램을 위해 태어난 언어라고 해도 과언이 아닙니다. 예제를 통해 golang이 동시성을 만족하는 코드를 작성하여 보여드리겠습니다. 동시성을 위해 goroutine과 channel 개념을 사용합니다. 각 개념은 아래 링크에서 확인할 수 있습니다. - goroutine : golang.site/go/article/21-Go-%EB%A3%A8%ED%8B%B4-goroutine Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드(주1)이다. Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다. goroutine은 비동기적으로(asynchronously) 함수루틴을 실행하므로, 여러 코드를..

Golang backend programming - Http get 호출 + timeout 처리

약간 멍청하게 생긴 golang 마스코트 Golang의 백엔드 프로그래밍을 하기 위해 아래 조건을 갖춘 프로그램을 개발하기로 했다.5초 마다 http get 호출1초 이상 http get이 지연되었을 경우 timeout 발생Golang의 timeout을 사용 - select와, channel 활용 (Golang의 특징, timeout 설명 페이지 바로가기) 코드 123456789101112131415161718192021222324252627282930313233343536373839package main import ( "fmt" "time" "net/http" "io/ioutil") func main(){ for { fmt.Println("Http request start") c1 := make(ch..

Golang의 독특한 특징 3가지 - A declared are not used, Multiple return values, Timeout

기존 java 개발에서는 볼 수 없었던 독특한 golang만의 특징 몇가지를 소개하고자 한다. - 아래 내용들은 Jetbrains사의 GoLand IDE를 사용하였습니다. - Jetbrains사의 GoLand IDE사용하여 Golang 실행하기 포스트 바로가기 A declared are not used - Golang은 variable을 선언해놓고 쓰지 않으면 compile이 불가하다. Multiple return values - Java에서는(적어도 java 8 이전) 1개의 method 혹은 function에 대해서 return은 1개의 값만 가능하다. private int sum(int a, int b){ return a + b; } private int multiple(int a, int b){ ..

Jetbrains사의 GoLand로 Go언어 시작하기

Go언어는 2009년에 만들어져서 현재까지 활발히 발전되고 사용되는 언어이다. 간단하게 golang을 개발하자면 terminal, sublimetext로 개발할 수 있지만 좀더 나은 편의성을 사용하기 위해 Intellij를 만든 제작사인 jetbrains사의 Golang전용 컴파일러인 GoLand(사이트 바로가기)를 사용하는 것도 좋은 방안이다. JetBrains사에서 소개하는 Go IDE(GoLand) 준비물3분맥북터미널인터넷환경homebrew 설치GoLand 공식사이트에서 환경에 맞는 버젼을 고른 후 설치한다. 수행GoLand를 실행한다.src 이하에 main package를 생성하고 적절한 경로에 프로젝트 경로를 정한다. 우클릭을 통해 new > Go file, main.go를 생성한다. (case..