일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Go
- 양자역학
- 건프라
- 프라파손
- emacs
- 패널라인
- 바로코
- driverless
- 벤치마크
- Reflection
- 엘리스배열
- Go 언어
- 체리적축저소음
- 터미널
- 음각몰드
- mf642cdw
- mopria
- nil
- md600alpha
- Griffiths
- magicsculpt
- 고양이책
- mistel md600 alpha
- 키보드
- 스플릿키보드
- Golang
- 리플렉션
- go언어
- 이맥스
- 다이어트
- Today
- Total
목록Golang (11)
Meandering Trajectory
panic Go에서 에러 처리는 반환값을 통해 이루어지는 것이 일반적이다. 하지만 프로그램 수행을 더 이상 진행할 수 없을 정도의 심각한 에러가 발생한 경우 Go 런타임은 panic을 발생시킨다. 예를 들어 아래 프로그램은 고의로 "index out of range" 예외를 일으키고 있는데package main import ( "fmt" ) func fn() { a := []int{1,2,3}; fmt.Println(a[3]); } func main() { fn() } 이때 Go 프로그램은 panic을 발생시키고 그 결과는 다음과 같다.panic: runtime error: index out of range goroutine 1 [running]: main.fn() /tmp/sandbox410484699..
Go의 인터페이스 타입 변수는 단순한 포인터가 아니다. 예를 들어 인터페이스 I를 구현한 구조체 S가 있다고 할 때, var s *Svar i Ii = s 위 코드에서 s는 초기화를 하지 않았으므로 nil이지만 이변수가 대입된 i는 nil이 아니다. 그 이유는 인터페이스가 nil이 되기 위해서는 내부적으로 타입에 해당하는 필드와 값에 해당하는 필드가 모두 nil이어야 하기 때문이다. 다시 말해서 위 코드에서 i가 nil이 아닌 이유는 값에 해당하는 필드는 nil이지만 타입에 해당하는 필드가 nil이 아니기 때문이다. 더 자세한 설명은 다음 링크 참고:"nil" Interfaces and "nil" Interfaces Values
변수 선언 Go의 기본적인 변수 선언 방법은 다음과 같다. var v int Go에서는 변수를 선언할 떄 초기화 하지 않으면 각 타입별 기본값으로 초기화된다. int와 같은 숫자를 표현하는 타입은 0이 기본값이다. 따라서 위와 같이 선언을하고 나면 v의 값은 0이 된다. 원하는 값으로 변수를 초기화하고 싶다면 이렇게 하면 된다. var v int = 7 또는 var v = int(7) 이렇게 해도 된다. 단축형 선언 그리고 Go에는 변수를 선언하는 다른 방법이 하나 있으니 바로 단축형 변수 선언이다. 다음과 같이 ":="를 이용해서 단축형 선언을 할 수 있다. v := 7 타이핑을 적게 한다는 것은 반길 일이다. 단축형 선언에는 독특한 특성이 하나 있는데 바로 변수 재선언이 가능하다는 것이다. 아래 코드..
에러타입(error)의 정체 Go는 예외처리를 함수의 반환값에 기반하여 처리한다. 하지만 C와 달리 에러의 타입을 표준화 했다. 에러타입은 error라는 이름을 가지고 있고 다음과 같이 정의되어 있다. type error interface { Error() string } Error() 메서드 한개를 가진 인터페이스다. 이 인터페이스를 구현한 어떤 타입이든 에러가 될 수 있다. 그냥 정수형도 사용자 정의 타입으로 만들면 에러로 사용 가능하고 멤버가 없는 구조체도 Error() 메서드만 구현하면 에러로 사용할 수 있다. // 정수를 사용자 정의 타입으로 정의 type intAsError int // Error() 메서드 구현 func (i intAsError) Error() string { return f..
Go에는 메모리에 오브젝트를 생성하는데 쓰이는 내장 함수가 2가지 있다. make와 new가 그것이다.newnew에 임의의 데이터 타입을 파라미터로 주고 호출하면 메모리에 해당 오브젝트를 생성한 뒤 오브젝트에 할당된 공간을 모두 0으로 초기화하고 그 포인터를 반환한다. 예를 들어type Point struct { x int32 y int32 } ptr := new(Point) // ptr의 타입은 *Point 이 코드에서 ptr.x와 ptr.y의 값은 0이 된다.부연하면 new는 내장함수로 builtin 패키지에 속하고 Go 언어 공식 매뉴얼에 나온 프로토타입을 보면 다음과 같다.func new(Type) *Type Type을 파라미터로 받아 *Type을 반환하게 되어 있다. 반환하는 값의 자료형이 포인..
고루틴과 채널은 Go의 대표적인 기능이다. 고루틴은 서로 다른 작업이 함께 진행될 수 있도록 해주고 채널은 고루틴들이 통신을 통해 협력할 수 있게 한다.select 문을 이용하면 여러 채널을 모니터링하다가 먼저 데이터가 도착한 채널의 데이터를 읽도록 할 수 있다. 이런 기능이 없다면 프로그래머는 각 채널별로 별도의 고루틴을 할당해야 한다. Go 스케쥴러의 특성상 지나치게 많은 고루틴을 사용하는 것은 부작용이 있을 수 있으므로 한개의 고루틴으로 여러 가지 일을 할 수 있다는 것은 여러 모로 좋은 일이다.이렇게 한개의 스레드를 이용해 여러 데이터 소스(이 경우 채널)를 한꺼번에 들여다 보고 있다가 먼저 도착한 데이터를 우선 읽어 처리하는 방식의 프로그래밍을 이벤트 기반 프로그래밍(event-driven pr..
Go에는 슬라이스라는 확장 가능한 배열이 있다. 다음과 같이 선언한 뒤 사용한다.var s []int s = append(s, 1, 2, 3)다음과 같이 변수 선언만 한 경우var s []int슬라이스는 값은 무엇일까? 정답은 nil이다.그런데 이렇게 선언만 된 슬라이스의 동작은 기묘하다. 예를 들어 다음과 같이 선언만 된 슬라이스를 출력하면var s []intfmt.Println(s)결과는 이 아니라[] 즉 빈 문자열이다. 심지어 이 슬라이스의 길이도 구할 수가 있다.fmt.Println(len(s)결과는 0이다. 슬라이스 자체를 출력했을 때 빈 문자열이 출력된 것과 결이 맞다.따라서 출력된 결과값만 봐서는 어떤 슬라이스가 빈 슬라이스인지 선언만된 슬라이스인지 알 방도가 없다. 그렇다면 이 슬라이스는 ..
아래 발표는 Go의 클로져를 이용해서 기존 코드를 그대로 둔 상태에서 기능을 추가하는 방법에 관한 내용을 담고 있다.GopherCon 2015: Tomas Senart - Embrace the Interface발표 내용이 어느쪽으로든 다소 충격적일 수 있으니 놀라지 말기를...
BMT 즉 BenchMark Test는 업계에서 흔히 자주 언급되는 용어다. 제품 선정 전에 성능 검증을 위해 종종 수행되는데 수행하는 과정이 고통스러워 되도록이면 피하고 싶은 작업이다. 하지만 일과 관계없는 벤치마크는 항상 흥미진진하다. 다양한 언어에 대해 성능 테스트 결과가 올라와 있는 사이트가 있다. Computer Language Benchmarks Game이라는 사이트인데 Go를 한창 배우고 Go 코드도 많이 읽고 있는 터라 이 사이트를 살펴봤다. Go도 GC를 가진 언어고 Java도 GC를 가진 언어이니 이 둘을 비교하는 것이 재미있을 것 같아 이 둘을 비교한 페이지를 클릭한 순간, 이럴수가… Go의 상태가 이게… binary-trees source secs mem gz cpu cpu load..
09-go-chan.html Go에 대한 인상 Go 언어는 처음에 걸었던 기대와 달리 약간 실망스럽다. 문법이 난잡하게 느껴지고 그래서 Go 언어로 작성된 프로그램도 지져분하게 느끼진다. 혁신적으로 보이는 특징도 별로 안 보인다. 21세기에 설계된 언어로 작성된 프로그램에서 세그멘테이션 폴트 에러를 보는 것도 별로 유쾌하지 않고 말이지.하지만 한가지 맘에 드는 것이 있다. 그것은 Go 루틴과 채널이다. 이 둘을 빼면 Go는 그냥 그저 그런 명령형 언어였을 것이다. 이번 포스팅에서는 채널에 대해 간략히 살펴보려고 한다. Go 루틴과 채널 C와 같은 전통적인 프로그래밍 언어에서 쓰이던 스레드 대신, Go 언어는 동시성 프로그램밍을 위해 Go 루틴이라는 특이한 기능을 제공한다. Go 루틴을 이용해 작성된 프로..