타입 ③ slice·map·string — 겉은 C++ 컨테이너, 속은 다르다
Go의 핵심 자료구조. slice가 std::vector가 아니라 '배열의 뷰'라는 것(len/cap·append 공유 함정), map의 지정되지 않은 순회 순서와 comma-ok·nil map 함정, 그리고 string이 임의 바이트열이라 byte·rune·사용자 인식 문자를 구분해야 하는 이유까지 정리한다.
Go의 핵심 자료구조. slice가 std::vector가 아니라 '배열의 뷰'라는 것(len/cap·append 공유 함정), map의 지정되지 않은 순회 순서와 comma-ok·nil map 함정, 그리고 string이 임의 바이트열이라 byte·rune·사용자 인식 문자를 구분해야 하는 이유까지 정리한다.
Go에는 클래스가 없다. 데이터(struct)와 동작(method)을 분리하고, 상속 대신 컴포지션(embedding)으로 조합하며, implements 선언 없이 인터페이스를 암묵적으로 만족시키는 Go의 타입 사고. 그리고 인터페이스 구현이 '왜 안 되지'의 90%인 method set — 포인터 vs 값 리시버 규칙까지 C++ 대응으로 정리한다.
C를 알면 Go 문법 절반은 익숙하다. 이 글은 암기가 아니라 C++과 다른 Go의 뼈대 규칙을 잡는다 — := 짧은 선언과 다중 반환값, for가 유일한 반복문, 명시적 변환만 허용, zero value와 nil, 그리고 헤더 없이 패키지 단위로 묶이고 대문자로 export를 결정하는 구조와 go mod까지. 안 쓴 변수·import가 컴파일 에러라는 Go의 태도도 함께.
C++ 배경에서 Go로 넘어올 때의 학습 순서를 기초·타입·에러·동시성·도구로 묶고, 각 주제를 필수·나중·선택으로 표시한 로드맵. C++ 개념과의 대응, 정본 교재(A Tour of Go·Go by Example) 링크, 자주 막히는 지점을 함께 정리한다. 상세 글은 배우면서 채워 나가는 진행형 인덱스.
LazyVim이 기본으로 얹는 플러그인은 이미 문서화했다. 이 글은 그 밖 — snacks.picker↔fzf-lua, neo-tree↔oil.nvim, blink↔nvim-cmp 같은 '기본값의 대안'과, harpoon·neogit·avante 같은 기본에 없는 인기템, 그리고 blink·oil·avante로 이어지는 2025-2026 라이저를 별 개수·정착도와 함께.
ifconfig·netstat·route는 이제 레거시입니다. iproute2(ip·ss)로 인터페이스·라우팅·소켓을 진단하고, /etc/hosts·resolv.conf와 dig·getent로 DNS를 파고드는 표준 흐름.
tmux 훅 안에서 #{window_id}는 이벤트 윈도우가 아니고, pane-exited는 kill-pane에 안 뜬다. 계측으로 두 함정을 잡은 기록.
'No space left on device' 알림부터 시작해서 — 어느 파티션이 찼는지(df), 무엇이 잡아먹는지(du), 지웠는데 안 줄어드는 함정(lsof)까지. 그리고 블록 장치·마운트·fstab의 기초.
프로세스를 서비스로 띄우고(systemctl), 부팅에 등록하고(enable), 유닛 파일로 정의하고, cron 대신 타이머로 돌리는 표준 흐름. enable과 start의 흔한 혼동과 daemon-reload 함정까지.
서버에 어떻게 들어가고(ssh·~/.ssh/config), 키 인증을 어떻게 붙이고, sshd_config로 그 문을 어떻게 잠그는지. 특히 자기 자신이 잠기지 않고 하드닝하는 순서까지.