공부/Go 9

Go에서 배열 구조체를 포함한 구조체의 값 변경할 때 주의사항

Go에서 이미 값이 할당된 다중 구조체(nested structure)의 내부 배열 구조체에 어떤 값을 변경할 때는 for 문에서 인덱스를 사용해서 직접 접근해야한다. 가끔 습관적으로 for k, v := range S 를 하며 v를 통해 값을 할당하는 실수를 저지르게 된다. type Outer struct { name string inner []Inner } type Inner struct { A int B int } func changeInner() { outer := Outer{ name: "togomi", inner: []Inner{ { A: 5, B: 6, }, }, } for k, v := range outer.inner { // 잘못된 방법 v.A = 1 v.B = 2 // 옳은 방법 out..

공부/Go 2023.12.14

golang http connection(socket) 재사용하기

회사에서 부하테스트를 하던 도중 겪은 일이다. 부하를 주는 클라이언트가 할당된 리소스도 다 사용하지 못하고, 기대하던 RPS도 나오지 않는 현상이 있었다. netstat 명령어로 확인 결과 상당 수의 소켓의 status가 TIME_WAIT 인 것을 발견했다. TIME_WAIT은 연결은 종료된 상태지만, 바로 소켓을 반납하지 않고 혹시나 송신측에서 데이터를 보낼 수 있는 것을 기다리는 상태이다. 내가 기대했던 바는 소켓을 종료하지도, 반납하지도 않고 다음 통신에 재사용하는 것이다. 사실 해결법은 정말 간단하다. go http 패키지는 기본적으로 소켓 재사용 정책이 적용되어있기 때문에, 아래 사항만 모두 지켜주면 된다. response body를 전부 읽는다. body를 close한다. 중요해서 볼드체로 했..

공부/Go 2023.06.22

k8s client-go custom resource 생성(post 사용 시 주의점)

k8s client go에서 custom resource를 생성하기 위해서는 abspath()와 post()를 사용해야 한다. k8s client go도 내부적으로는 kube-apiserver에게 REST api 콜을 보내는 것이므로, kube-apiserver의 규칙에 따라야 한다. kongPlugin이라는 custom resource 생성 시 아래와 같이 하면 된다. kongPlugin := &KongPlugin{ TypeMeta: metav1.TypeMeta{// 1 APIVersion: "/", Kind: "KongPlugin", }, ObjectMeta: metav1.ObjectMeta{ Name: "kongplugin-sample", Namespace: "", }, ...}} body, err..

공부/Go 2022.09.15

Go API server template + Dockerfile & yaml

예전에 만들어둔 Golang API 서버 템플릿을 공유한다. https://github.com/aldlfkahs/go-api-server-template GitHub - aldlfkahs/go-api-server-template Contribute to aldlfkahs/go-api-server-template development by creating an account on GitHub. github.com 간략한 코드 설명은 아래와 같다. func main() { mux := http.NewServeMux() mux.HandleFunc("/test", serveTest) mux.HandleFunc("/hello", serveHello) klog.Info("Starting Go test api ser..

공부/Go 2022.07.09

golang convert []byte(byte array) to map[string]interface{}

모르는 json 형식이 들어왔을 때는 이전에 내가 쓴 글처럼 하면된다. https://togomi.tistory.com/48 golang convert json to interface go에서 json을 파싱할때 struct 구조를 모르거나, 키값 하나만 필요한데 struct는 너무 커서 곤란할 때가 있다. 그럴 땐 interface를 통해 파싱하면 간편하다. exampleJson이라는 변수에 json string이 담겨있다 togomi.tistory.com 하지만 위의 글에서는 인풋이 string이라는 전제가 깔려있다. 이런 전제가 만족되지 않는 경우가 있다. http post의 request body를 처리하다가 이 이슈를 겪었다. request를 처리하는 서버 쪽에서는 []byte 형식으로 들어올 ..

공부/Go 2022.06.22

golang convert json to interface

go에서 json을 파싱할때 struct 구조를 모르거나, 키값 하나만 필요한데 struct는 너무 커서 곤란할 때가 있다. 그럴 땐 interface를 통해 파싱하면 간편하다. exampleJson이라는 변수에 json string이 담겨있다고 가정했을 때, 아래 코드로 파싱 가능하다. const exampleJson = `{"kind":"Event","apiVersion":"events.k8s.io/v1"}` var result map[string]interface{} if err := json.Unmarshal([]byte(exampleJson), &result); err != nil { panic(err) } fmt.Println(result["kind"]) // Event 출력 fmt.Print..

공부/Go 2021.10.20

golang http 코드 예시(golang http skeleton code)

어딘가에 유용하게 쓰기위해 함수를 따로 만들어봤다. method, request url, request body를 파라미터로 받고, response body를 return해주는 함수이다. func ExecuteAPI(method string, url string, data interface{}) []byte { fmt.Println("===============") fmt.Println(method, url) var req *http.Request var err error client := &http.Client{} if data != nil { // POST, PUT, DELETE.... json_body, err := json.Marshal(data) if err != nil { fmt.Errorf(..

공부/Go 2021.09.20

go mod download dial tcp i/o timeout 오류

어느 날 갑자기 잘 되던 docker image build가 안됐다. 원인은 go mod download에서 i/o timeout이 문제였다. 처음에는 DNS서버 문제인가 싶어서 네트워크 설정을 바꾸고 재시작도 해보았지만 그대로였다. 해결법은 의외로 간단했다... 그냥 아래 명령어 한 번 치면 된다. $ go mod tidy go mod tidy를 치니까 아주 잘 된다. go mod tidy는 필요없는 의존성을 제거해주는 명령어이다. 아마도 go가 의존성 관리를 하면서 무언가가 꼬였었나 보다 ============= 며칠 후에 또 같은 오류가 발생했다. 2시간 정도를 뻘짓하다가 허무하게 해결했다. 그냥 도커를 재시작하니 됐다. $ systemctl restart docker 도커 설치한 이후에 내 우분투..

공부/Go 2021.09.06