golang flag package 의 함정
By SeukWon Kang
지금 하고 있는 ( 회사에서 만드는 server 기반 mobile game ) 프로젝트에서
서버 테스트용 ai client 작업을 하다생긴 삽질기록입니다.
프로그램 실행용 인자들의 타입이
Concurrent int
AccountPool int
AccountOverlap bool
LimitStartCount int
LimitEndCount int
RetryDelayTimeOut int
Storyname string
일때
아래의 go 실행 문장에서 이상한 점을 찾으면 진정으로 golang을 많이 써본 사람이라고 인정해 줄수 있을것 같습니다.
-i 는 config를 url에서 얻어오는 옵션으로
( 신경쓸필요없습니다. 그냥 인자가 길고 많다는 의미 )
go run rundriver/client_story.go -i “http://localhost:10003/client.ini?prefix=Aaa&ll=1023” -Concurrent 1000 -LimitStartCount 0 -LimitEndCount 0 -AccountPool 2000 -AccountOverlap false -RetryDelayTimeOut 1 -Story Idle
위의 형태로 실행하면 인자들중 일부가 적용되지 않아 제대로 작동하지 않습니다.
각 인자의 의미야 상상하시는 그대로 일것이고 ( 서버 테스트용 client를 만들어봤다면 )
그래서 false가 역시 수상해 라고
go run rundriver/client_story.go -i “http://localhost:10003/client.ini?prefix=Aaa&ll=1023” -Concurrent 1000 -LimitStartCount 0 -LimitEndCount 0 -AccountPool 2000 -AccountOverlap 0 -RetryDelayTimeOut 1 -Story Idle
바꿔봐도 해결되지 않더군요.
설마 linux에서 command line 길이 제한을 넘어가나 하고
구글을 검색해보니
$getconf ARG_MAX
로 확인해 보라고 해서 확인하면
2097152
약 2M –;
내가 사용하고 있는 fish shell문제인가 하고
bash에서 실행해도 똑같습니다. ;;
그럼 golang에서 사용하는 flag package 가 문제인가 하고
flag 소스 코드를 들여다 봐도
그런 제한 같은것은 없습니다.
그래서 마음을 비우고 flag package 문서를 꼼꼼히 읽어보기 시작했습니다.
-flag
-flag=x
-flag x // non-boolean flags only
ㅠㅠ
bool type 인 경우만 취급 방법이 다르다!
go run rundriver/client_story.go -i “http://localhost:10003/client.ini?prefix=Aaa&ll=1023” -Concurrent 1000 -LimitStartCount 0 -LimitEndCount 0 -AccountPool 2000 -AccountOverlap=false -RetryDelayTimeOut 1 -Story Idle
로 쓰니 문제 해결되었습니다.
역시 뭔가 이상하면 매뉴얼을 봐야합니다.
ps) 팀원들에게 공유했더니 다들 “헛갈리니까 인자를 int로 바꾸고 내부에서 변환해서 쓰자"고 해서 int로 바꿨습니다.
ps2) 예전에 go언어를 사용하면서 주의 할 부분 에 적은
encoding/json 패키지를 사용해서 unit8(==byte) array 나 slice를 encode 하는 경우 이 결과를 decode하면 에러가 난다. ;;;
가 생각났습니다.