피드로 돌아가기
Go BlogGo Blog
Backend

//go:fix inline and the source-level inliner

Go 팀이 //go:fix inline 지시어를 추가해 소스 레벨 인라이너를 go fix 명령어에 통합함으로써 패키지 저자가 API 마이그레이션을 자동화할 수 있는 기반 제공

Alan Donovan2026년 3월 10일9intermediate

Context

Go의 호환성 보장 정책으로 인해 deprecated 함수를 제거할 수 없고, 사용자들이 수동으로 코드를 업데이트해야 하는 문제가 있었다. 또한 Go 생태계에서 API 설계 변경이나 함수 마이그레이션을 안전하게 자동으로 처리할 도구가 부족했다.

Technical Solution

  • 2023년에 개발한 소스 레벨 인라이닝 알고리즘을 go fix 명령어에 통합: 함수 호출을 호출된 함수의 body 복사본으로 치환하는 방식으로 API 마이그레이션 자동화
  • //go:fix inline 지시어 도입: 패키지 저자가 deprecated 함수에 주석을 추가하면 go fix가 자동으로 호출 지점을 인라인 처리
  • gopls의 "Inline call" 대화형 리팩토링과 동일한 인라이너 엔진 재사용: 코드 변환 도구의 정확성과 신뢰성 확보
  • 함수 서명 변경(Change signature)과 미사용 매개변수 제거(Remove unused parameter) 리팩토링에서 호출 지점의 미묘한 정확성 문제 처리
  • ioutil.ReadFile → os.ReadFile 같은 함수 이름 변경 또는 oldmath.Sub → newmath.Sub 같은 API 설계 결함 수정 패턴을 인라이닝으로 표현

Impact

Google 모노레포에서 go fix 인라이너를 사용해 18,000개 이상의 변경 목록(changelists)을 준비했다. Java, Kotlin, C++용 소스 레벨 인라이너 도구들이 Google 코드베이스에서 수백만 개의 deprecated 함수 호출을 제거한 선례가 있다.

Key Takeaway

소스 레벨 인라이너 같은 자동화 도구를 "self-service" 형태로 제공하면 패키지 저자가 API 마이그레이션 로직을 한 번만 정의하고 사용자는 go fix 한 번의 실행으로 대규모 코드베이스를 안전하게 업데이트할 수 있다. 이는 호환성 유지와 현대화 사이의 균형을 프로그래밍 도구 수준에서 해결하는 방식이다.


Go 패키지 저자는 deprecated 함수나 변경된 API에 //go:fix inline 주석을 추가하고 함수 본문을 새로운 API 호출로 구현하면, 사용자들이 go fix 명령어 한 번으로 모든 호출 지점을 자동으로 마이그레이션할 수 있다. 이 방식은 gofmt -r 같은 임의 재작성 도구보다 안전한데, 함수 본문 복사본으로만 치환하므로 프로그램 동작 변화가 없기 때문이다.

원문 읽기