
Report for hosting Ubuntu 18.04 LTS Release Party in Korea
Last weekend, We(Ubuntu Korea Community) hosted Ubuntu 18.04 LTS Release Party in 3 different cities. We hosted event on Saturday at Seoul and Busan, …
최근 3~4주간 Go언어에 관심이 생겨 참조문서 보면서 사용해 보고 있는데요, 때마침 이번 휴가중에 Go 1.13 Release Party 행사가 있어서 참석하고 왔습니다.
장소는 선릉역 근처에 있는 센드버드 코리아(Sendbird Korea) 에서 진행되었습니다.
홍혜종 님께서 곧 나올 Go 1.13 에서 달라진 점을 릴리스 노트 초안을 보여 주시면서 소개해 주셨습니다. 알려주신 내용을 간단히 정리하자면 아래와 같습니다.
go get
으로 설치하면, go
명령어와 별개로 사용이 가능합니다.
go1.13rc1
이라는 별도의 명령어 사용.Go 는 스타일 숫자 리터럴 채택. 지난 약 10년간 다른 언어는 C스타일 리터럴 표현이 달라졌는데 이를 반영하여 변경
쉬프트 연산(«, »)이 부호 없는 정수만 가능했으나, 부호 붙은 것도 가능.
go env
명령으로 Go 에서 사용하는 환경변수를 관리할 수 있습니다.
go env -m
: 지정된 곳에 환경변수 저장go env -u
: 환경변수 삭제go version -m "bin"
: Go 바이너리 파일의 의존성 정보를 출력go build -trimpath
: 실행 파일에 로컬 디렉토리 경로 제거godoc
이 포함되지 않는다고 합니다. 이는 Go 툴체인 바이너리의 용량을 줄이기 위해서 라고 합니다.defer
가 한번만 호출되면 스택에 할당Go의 GC는 메모리 해체를 너무 느슨하게 해서 실행하는 동안 OOM(Out of Memory)위험이 크다고 합니다(저도 Go 써본지 얼마 안 되었지만… 공감이 좀 많이 되는거 같네요.) 해결책은 debug.FreeOSMemory()
함수를 직접 호출하는 것인데. 이건 비용이 너무 크다고 합니다. 이를 보완하기 위해 여러 해결책이 도입되어 왔다고 하는데요.
context
패키지 fmt
의존성 제거sync.Pool
mutex
로 동기화를 해서 충동 방지를 했으나, 이제 이를 제거해서 속도를 빠르게 함sync.Pool
은 원래 작은 사이즈 다루기에 좋음. 큰거는 오히려 느림Format()
, Parse()
함수에 day-of-year 지원 추가바로 이어서 권민재 님께서 Go 에서의 오류 핸들링 방법과 함께 Go 2, Go 1.13 에 오기 까지 제안된 Error
와 관련되어 제안된 것들을 소개해 주셨습니다.
Go 에서는 Go 2 초안에서 주요 주제로 다룰 정도로 오류와 관련된 것이 많이 부족한 것이 많다고 합니다. 이를 개선하기 위해 어떤 논의가 있었는지도 알려주셨습니다.
지금까지 수많은 Proposal 이 있었는데, 그 중 제대로 논의 된 것은 아래와 같다고 합니다.
check
and handle
, try
, if err != nil
Unwrap
, Is
, As
), Error formatting, Error stackcheck
, handle
은 panic
, recover
와 유사합니다.
handling 코드를 하나의 블록으로 합칠 수 있고. 스코프 작동은 defer 와 유사합니다.
defer
블록 안에서는 check
사용 불가.(defer 보다 handle
이 먼저 돌아가기 떄문입니다.)
func printSum(a, b string) error {
handle err { return err } // 오류 핸들링 블록
x := check strconv.Atoi(a) // 오류가 발생할 수 있는 함수 호출시 check 를 앞에 붙임
y := check strconv.Atoi(b)
fmt.Println("result:", x + y)
return nil
}
try
- 1.14 에 들어갈 뻔 하다가 반려 되었다고 합니다. 아래와 같은 특징이 있습니다.
error
라는 named results
를 이용
try
적용 전 오류 핸들링
f, err := os.Open(filename)
if err != nil {
return …, err // zero values for other results, if any
}
try
적용 후 오류 핸들링 예시
f := try(os.Open(filename))
Error inspection 오류의 근본적 원인과 생성된 순서를 자세히 표시
감싸진(Wrap) 오류를 한 단계식 까면서, 각 단계별 오류를 검사하고 근본적인 원인까지 확인 가능한 기능에 대해 논의가 이뤄졌다고 합니다. 이를 통해 Wrapper
인터페이스가 제안 되었습니다.
Unwrap
) 구현Is
, As
로 체이닝된 오류를 검사As
는 Is
와 유사하나, 하나의 오류만 검사할 수 있음.오류 포매팅을 위한 Formatter
인터페이스 제안 되었으나, Errorf()
사용시, %w
서식문자를 사용하면 자동으로 레핑되기 떄문에 포함하지 않기로 했다고 합니다.
이렇에 논의 된 것중, Go 1.13 에는 Unwrap
, Is
, As
, %w
이렇게 4가지가 추가될 예정이라 합니다.
Go 1.11 부터 Go Modules 이 추가 되면서 의존성 관리가 편리해 졌는데요, 그 전에는 어떻게 의존성 관리가 이뤄졌는지 그리고 Go Modules 명령어에 대해서도 김건 님께서 간단히 설명해 주셨습니다. 이 때는 10쯤 되어서 조금 피곤하다보니 중간에 살짤 졸아서 발표 내용을 다 정리 하지는 못했습니다.
go mod
명령어 추가Go Modules in Go 1.13
go get
- 이제 Go Modules 환경까지 고려하여 작동한다고 합니다행사 시작 시간이 저녁 시간임을 고려해서, 피자와 음료를 제공해 줘서 두 조각 정도 맛있게 먹었습니다.
휴가 중 운이 좋게도 행사 날짜가 겹처서 참석하고 왔는데, 저녁 시간이라 조금 피곤했지만 발표 내용이 꽤 알차가 좋아서 참석하기 잘 했다는 생각이 듭니다. 마지막에 경품 당첨은 안 되었지만. 그래도 많은것을 알아가는 행사였던 것 같습니다.
Last weekend, We(Ubuntu Korea Community) hosted Ubuntu 18.04 LTS Release Party in 3 different cities. We hosted event on Saturday at Seoul and Busan, …
이 글은 Steemit 에서도 읽으실 수 있습니다. 최근 블록체인에 관심을 많이 가지고 있는데요, 특히 dApp 개발. 그 중에서도 EOS dApp 개발에 가장 관심을 가지고 있습니다. 정작 EOS dApp 개발 관련 문서를 이제 막 찾아 읽어보기 시작한지라, …