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는 참 좋은데...문자형으로 들어가는 경우엔 아주 짜증나는 경험 가능.
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는 참 좋은데...문자형으로 들어가는 경우엔 아주 짜증나는 경험 가능.
야발
제네릭도 없꼬.. 거기다 오버로딩도 업슴... 둘중 하나라도 있었으면
제네릭은 1.17 올해 3분기 예정임
지금은 없자나
여긴 디시입니다 마크다운은 없어요
ㄹㅇㅋㅋ
대신 성능 좋은
http://hilite.me/
로 신택스 하이라이팅을 하십시오
html로 내보낸거 붙여넣는데 깨지길레 걍 그대로 붙여넣음..ㄷㄷ
하이라이트미는 될 거임 제가 아주 애용하는데 깨진 적도 없고 하이라이팅에 박히는 흐트믈도 적어서 긴 코드도 하이라이팅 가능
C++ 다시 보니 선녀같은데 정상?
혹시 쌓여 있으신가요
너 쌓여있잖아
게임서버에서 고랭 좀 보이던데
써놓은 건 그닥 단점인지 모르겠으나 generic과 ordered map이 어서 나왔으면 좋겠고 정렬 알고리즘 복잡도 좀 개선했으면 좋겠음 sort.Stable 복잡도 O(n log^2 n)인 거 개오바임
c++ 도 찾아보니 n lg^2 인데?
https://en.cppreference.com/w/cpp/algorithm/stable_sort
아 조건이 붙어있긴 하네. golang은 모든 경우에 n lg^2 인건가
읽어봤는데 stdc++의 경우 in-place면 n log^2 n이고 그렇지 않으면 n log n인데 Go는 sort가 인터페이스라서 모든 타입에 대해 in-place stable sort를 제공하기 위해 n log^2 n인 거 같음 in-place로 해주니까 그냥 써야겠군 ㅇㅅㅇ
근데 assert 없이 어케 사누 if else로 떡치나
근데 그냥 직접 하나 만들면 되는거 아님?
코드 라인이나 파일 이름 같은 메타 데이터 쉽게 가져올수 있음 상관없는데..
2번 ㅆㄹㅇ 구조체 nil 체크 포인터 아니면 안되는거 ㅈㄹ 빡침
나는 컴파일러 맘에안듬 빌드속도 빠르게하는건 ㅇㅈ인데 좀 시간 걸리더라도 최적화 더 빡세게하는 옵션이라도 있었으면 함 고루틴같은것도 마찬가지
닉값 ㄷ
6번은 임시값을 레퍼런싱하면 즉시 댕글링되어서 아니냐 go만의 단점은 아닌거같음
근데 할당이나 반환값/파라메터에는 쓸 수 있자나. 그건 왜 그럼?
https://play.golang.org/p/RdPvMTY5mmI
이런 걸 말하는거? 이해를 잘 못했음