Skip to content
SUN10AM Go study
Go
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
yesdoing
.gitignore
README.md

README.md

What is this study for?

일요일 아침 11시에10시에 Go Study 를 하는 GOSU들의 저장소 입니다

How to study

  1. <learn-go-with-tests> 문서의 Go fundamentals 예제를 따라 TDD로 Go를 실습하면서 문법을 익히고, 결과물을 자신의 디렉토리에 커밋합니다.
  2. 책 <디스커버리 Go 언어> 는 필요한 경우 참조합니다.
  3. 문법 공부가 끝나고 간단한 토이 프로젝트를 만들어 봅니다.

History

sample
  • nil
190922-9th
  • Concurrency
    • 여러개의 웹사이트를 비동기적으로 체크하는 CheckWebsites를 만들면서 고루틴의 기본을 배움
    • 고루틴은 go로 선언하고 Go에서 동시성을 다루는 기본 단위이다.
    • 각각의 웹사이트를 체크하는 프로세스를 고루틴으로 실행하기 위해 익명함수를 사용했다.
    • 테스트를 PASS했어도 여러번 돌려보면 랜덤하게 PANIC 에러가 뜨는데, 경합(race)이 발생하기 때문
    • Channel이라는 자료구조를 사용하여 경합을 해결할 수 있다.
    • race 옵션으로 동시성 코드에서 발생할 수 있는 문제를 디버깅 가능하다.
    • Make it work, make it right, make it fast
190915-8th
  • Mocking
    • countdown 프로그램을 만들고 timer를 Mocking했다.
    • 문제를 작게 분할하고 동작하는 프로그램을 먼저 만들어라.
    • 코드가 어려워서 테스트하기 어렵다고? 테스트하기 좋게 코드를 짜야 한다.
    • 리팩토링은 코드는 달라도 동작은 같은 것이다.
    • 테스트의 가치와 리팩토링했을 때의 효과를 항상 염두에 둬야 한다.
190908-7th
  • Dependency Injection
    • DI 를 사용하면, 테스트 친화적이고 범용적인 함수를 작성할 수 있다
    • 만약 함수의 테스트가 쉽지 않다면, 전역 상태나 의존성에 대해 강하게 묶여 있다는 의미이다
      • 전역 데이터페이스 연결 풀 같은 경우에는 테스트 하기가 쉽지 않은데 (서비스 레이어에서 사용되고 있으므로) 이런 경우에 활용할 수 있다
    • 데이터가 생기고 흘러가는 것에 대한 디커플링이 가능합니다
      • 만약, 함수의 의존성이 너무 많다고 느껴진다면 DI가 올바른 답일 수 있습니다
    • 컨텍스트에 한정되지 않는 범용적인 함수를 작성할 수 있습니다
    • Go Built-In library 를 잘 살펴보는 것이 올바른 함수를 작성하는데에 도움이 될
190901-6th
  • TDD: 8.Maps
    • key-value 형태로 값을 저장할 수 있으며 key를 통해 빠르게 데이터 검색이 가능한 해쉬테이블
    • value 타입은 어떤 타입이든 들어올 수 있지만 key의 타입은 Comparable 타입만 가능하다.
    • 결과 값을 반환할 때 Error객체에 문자열을 담아 반환 할 수 있다.
    • map은 reference 타입이기 때문에 아무리 큰 맵이라도 한번에 복사가 가능하다.
    • map은 절대로 empty하게 초기화 하면 안된다. (make를 사용하거나 {}를 붙여 선언해야한다.)
    • Error는 불변성과 재사용성을 위해 상수로 선언해서 사용하자.
    • map의 delete는 내장 함수를 사용한다.
190822-5th
  • TDD: 7.Pointers & errors
    • call by value vs call by reference: 상태를 바꾸고 싶다면 pointer 사용
    • 미리 다양한 Error 타입을 만들어 두고 사용할 수 있다
    • Error를 체크만 하지 말고 처리하자
    • 포인터만 nil을 가질 수 있으며, C처럼 이중 포인터 사용 가능(속도 최적화시)
    • _(blank identifier)는 관습적으로 선언은 하지만 사용하지 않을 변수를 말한다. lint에서도 미사용에 대해 잡지 않음
190821-4th
  • TDD: 6. Structs, methods & interfaces (2/2)
    • byte to uint64 어쩐지 타입캐스팅 (갑분C)
    • go polymorphism, encapsulation, pointer 조금씩 다룸
190817-3th
  • TDD: 6. Structs, methods & interfaces (1/2)
    • go struct, methods
    • go 에는 (명시적인) 메소드가 없으며, struct 는 여러 형태의 필드의 묶음일 뿐이다
    • go struct 의 생성 방법은 여러가지가 있다. new, literal struct ...
    • go interface 를 진행하려가다가 공부를 더 하고 진행하는 방향으로 후퇴
  • 다음 시간까지 숙제: struct, methods, interfaces 각자 정리해서 push (++ codekata 할 수 있으면 추가)
190815-2th
  • TDD: 3. Integers / 4. Iteration / 5. Arrays and slices
    • go Benchmark, Test coverage
    • go doc -> 아직 모듈에서는 제공하지 않음
    • reflect.DeepEqual 제공 (but not type-safety)
  • 다음 시간까지 숙제: Min, Max, Sort(bubble부터 quick까지 아무거나) 함수 만들기
190811-1th
  • TDD: 0. Install / 1. Hello, world
  • 다음 시간까지 숙제: TDD로 간단한 사칙연산 계산기 만들기

References

You can’t perform that action at this time.