일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- C++
- JUCE라이브러리
- Docker
- a tour of go
- 운영체제
- 리듬게임
- go channel
- 자료구조
- 백준
- C++ gui
- Nebula
- 코딩
- 공룡책
- C++ library
- LOB
- C++ gui 라이브러리
- JUCE
- JUCE library
- 프로그래밍
- go
- OS
- vim-go
- c++ heap
- C언어
- 알고리즘
- JUCE 튜토리얼
- tour of go
- gui
- 연결리스트
- BOJ
- Today
- Total
목록Programming/Go (22)
CafeM0ca
tour.golang.org/concurrency/10 A Tour of Go tour.golang.org 마지막 문제다. 웹 크롤링을 병렬적으로 실행시키면 된다. Crawl 함수를 수정해야하는데 똑같은 URL에 대해 fetch를 두번 하지 말아야한다. 패치를 할 때는 mutex로 잠궈서 패치시켜주면 동시에 map에 접근할 일을 방지할 수 있다. 먼저 Crawl 함수부터 보자. depth가 0이 되면 함수를 종료하고 그게 아니면 재귀적으로 Crawl함수를 호출한다. 현재 URL에 대해서 fetcher.Fetch(url)을 통해 크롤링 했다는 도장을 찍어준다. 우리의 목표는 Crawl 함수를 병렬적으로 실행시킴과 동시에 크롤링 했다는 도장을 url당 한번만 찍어주면 된다. 이해하기 쉽게 시각화 해보면 아래..
tour.golang.org/concurrency/9 A Tour of Go tour.golang.org Go에서 Mutex에 대해 배워보자. sync.Mutex에 있으며 Lock과 Unlock 2개의 메소드를 갖고 있다. 위 예제는 map의 값을 goroutine으로 병렬적으로 값을 증감시키는 예제다. Mutex로 locking 하는 이유에 대해서는 cafemocamoca.tistory.com/93?category=1008201 에 있는 pdf를 참조하자. 자세히 써놨을 것이다. Value 함수를 보자. 처음에 map 변수 c를 lock한다. 이는 주석에 써 있듯이 다른 고루틴의 접근을 방지하기 위해서다. 그리고 unlock은 defer를 통해 해준다. defer는 연산이 먼저 완료되도 함수가 끝날 때..
tour.golang.org/concurrency/8 A Tour of Go tour.golang.org 2개의 이진트리를 병렬로 실행하고 순회한 값이 똑같은지 비교하는 문제다. Walk는 쉽게 짰고 Same이 문제인데 컴퓨터 3년 하면서 이진트리를 병렬처리해서 비교해볼 생각을 안해서 난감했다. 정확히는 goroutine까지는 괜찮은데 채널 값을 뽑아서 비교하는게 문제였다. 아래 코드는 채널 값 비교를 빼고 구현한 코드다. package main import "golang.org/x/tour/tree" import "fmt" // Walk walks the tree t sending all values // from the tree to the channel ch. // 바이너리트리 순회해서 채널에 값을..
tour.golang.org/concurrency/1 A Tour of Go tour.golang.org 고루틴은 경량 스레드로 go runtime에 관리된다. 고루틴은 같은 주소 공간에서 동작하며 공유 메모리에서 반드시 싱크로되어 접근한다. 위에가 고루틴 소스코드인데 go 키워드를 사용해서 함수를 호출하면 된다. 진짜 심플해서 좋은 것 같다. Channel이라는 문법이 있는데, 채널은 데이터를 주고 받을 수 있는 통로다. 왼쪽 화살표가 채널의 연산자다. 맵과 슬라이스처럼 채널은 반드시 생성되면서 선언해줘야 한다. 기본적으로, 보내는 쪽과 받는 쪽은 다른쪽이 준비 될 때까지 block된다. 채널은 고루틴이 명시적으로 lock이나 condition variable(cafemocamoca.tistory.co..
tour.golang.org/methods/21 A Tour of Go tour.golang.org Reader는 io에 있는 인터페이스다. 특정 타입이 있으면 위 형식에 T 대신에 해당 타입을 치환시켜주면 된다. Go가 클래스가 없어서 멤버함수 대신에 이런식으로 사용하는 것인데, 이해가 잘 안된다면 cafemocamoca.tistory.com/281 를 참고하자 코드를 보면 MyReader를 Receiver로 갖는 Read method를 만들어주면 된다. 인자로 들어오는 b에 'A'를 채워주면 된다. tour.golang.org/methods/23 A Tour of Go tour.golang.org Read로 읽은걸 ROT13을 적용하는 문제인데 io.Reader는 Wrapper 형식으로 잘 쓰인다고 ..
tour.golang.org/methods/18 A Tour of Go tour.golang.org stringer에 대해서 먼저 알아보자면 fmt 패키지에 정의된 인터페이스로 흔하게 사용한다. Stringer는 특정 타입을 string으로 묘사할 수 있다. fmt 패키지를 보면 이 인터페이스가 값을 출력하는 것을 볼 수 있다 10번쨰줄을 보면 (p Person)을 receiver로 하는 메소드가 정의되어 있다. return 할 때 fmt.Sprintf로 포멧을 지정해준다. 17번쨰줄에서 출력을 하게되면 사전에 지정한 포멧으로 출력된다. Go를 쌩 처음한다면 어색할 수도 있는데(필자도 혼란스럽다) 비슷한게 뭐가 있나 생각해보니까 C++에서 오버로딩을 생각하면 이해가 쉽다. Name과 Age를 멤버변수로 ..
tour.golang.org/methods/15 A Tour of Go tour.golang.org Type assertion은 interface에 할당한 값에 내재된 구체적인 값에 접근을 제공한다. 코드를 보면 assertion은 내장된 값과 assertion이 발생 여부에 대한 bool type의 값을 반환한다. 17번째 코드를 보면 float64로 타입을 확인하고 있는데 assertion값을 받는 변수가 없어서 트리거가 작동하여 panic이 발생한다. 이렇게 타입을 체크하는 문법은 switch 구문에서 유용하게 사용할 수 있다.
tour.golang.org/methods/9 A Tour of Go tour.golang.org Go는 클래스가 없다. Interface 타입은 메소드 시그니쳐를 갖는다. interface 타입은 메서드를 갖는 값들을 가질 수 있다. 처음에 Abser라는 인터페이스를 선언했고 Absersms Abs()라는 메서드를 갖는다. 오른쪽 코드에서 Abs는 2개가 있다. 1. MyFloat를 value로 받는 메소드 2. Vertex를 pointer로 받는 메소드 Abser 타입의 변수 a에 f를 대입한다. f는 MyFloat 타입으로 Abs함수를 갖고 있다. f의 Abs는 Receiver가 value다. 따라서 a = f로 대입한다. v의 Abs는 Receiver가 pointer다. 따라서 a = &v로 대입..
tour.golang.org/methods/1 A Tour of Go tour.golang.org Go는 클래스가 없다. 하지만 특정 타입에 대한 메소드를 만들 수 있다. 이게 무슨 말 이냐 하면 Vertex와 Vertex3D 구조체가 있다. Vertex는 Abs라는 메소드를 갖는다. - func (v Vertex) Abs() float64 Vertex3D는 Abs라는 함수를 통해 연산이 가능하다. main 함수에서 vertex구조체는 .을 통해 메소드를 호출하고 있고 vertex3D구조체는 Abs 함수를 통해 연산하고 있는 것을 볼 수 있다. 다른 언어랑 비교해봤을 때 이런 구조로 가져가면 장점이 무엇인가 생각해보면 내 생각엔 타 언어에서 클래스에 무수히 많은 함수들이 있고 생성된 인스턴스들이 절반도 ..
Go언어의 함수는 closure가 될 수 있다. Closure는 함수값을 함수 밖에서 참조할 수 있는 변수를 말한다. 소스코드를 보면 adder() 함수는 반환값으로 int형 변수를 매개변수로 받고 return 값이 int인 함수를 리턴한다. adder 함수에서 리턴값으로 익명함수를 반환한다. pos, neg 변수에는 각각의 고유의 익명함수를 갖고 있는 상태라서 출력시 for문 안에서 서로 다른 값을 보장받게 된다. c++로 치면 함수 객체를 변수에 할당해준 느낌. closure를 사용해서 피보나치 수를 구현하는 문제다. 함수 안에서 현재 출력할 수와, 다음 수를 설정해주고 함수가 끝나기전에 변수의 값들을 바꿔주면 피보나치 수가 작동한다.