1. 패키지
primitive타입에 메서드를 못 붙히다보니 strings/strconv/bytes/binary/bufio같이 애매하게 비슷한 기능이 떨어져 있음.
처음 할 때 buffer가 bufio에 있을 줄 알았는데 bytes에 있어서 했갈렸음.

2. optional 타입의 부재
구조체 필드를 optional로 하려면 포인터를 써야됨.
    2-1. 그러면서도 부족한 null feature
        삼항 연산자 없어서 `val == nil ? defaultValue : val`도 안되고, 조건문도 브라켓 강제라 3줄, 4줄로 늘어남.
        `?.`이나 `!`이나 `!!`같이 쌔끈한것도 없음.
    2-2. 물론 optional 파라매터도 없음. `func(args ...string)`같이 배열로 받을 순 있지만

3. exception 없음
가끔 짜잘한 에러들 다 묶어서 퉁치고 싶을 때도 반환 받는 모든 곳마다 `iferr` 도배해야함.
```go
conn, err := makeConn()
if err != nil {
return nil, err
}

req, err := conn.Read()
if err != nil {
return nil, err
}
```
위의 단점과 맞물려서 치가 떨림.
아래와 같이 한 줄 줄이는 방법이 있지만 반환값이 해당 스코프에 속한다는게 문제.
```go
if i, err := handleMe(); err != nil {
_ = i // 사용 가능
}
_ = i // 사용 불가
```

4. 명시적인 인터페이스 구현 없음
해당 메서드만 구현하면 받아져서 장점이기도 한데 해당 인터페이스 들어가는 타입 자동 완성 안되는건 가끔 짱남.

5. assert 없음

6. 구조체 리터럴에 포인터 리터럴 못 씀

```go
func main() {
_ = Period{
time.Now(), // 가능
time.Now(),
}

_ = PeriodPtr{
&time.Now(), // 불가
&time.Now(), //
}
}

type Period struct {
StartTime time.Time
Endtime time.Time
}

type PeriodPtr struct {
StartTime *time.Time
Endtime *time.Time
}
```

7. struct tag 구림
```go
type User struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}
```
자동 완성도 안되고...어노테이션이 더 나은듯.

8. 열거형 없음
iota는 참 좋은데...문자형으로 들어가는 경우엔 아주 짜증나는 경험 가능.


야발