Go언어는 실행파일이 static 컴파일 되기 때문에 사용하는 패키지의 종류가 늘어나면 용량이 제법 커집니다.


실제로 Martini를 사용하는 간단한 프로그램을 만들었더니 2~6메가 정도가 되었습니다.


일반적으로 C에서는 동적 라이브러리를 사용함으로써 동일한 기반 기술을 사용하는 여러개의 어플리케이션을 만든다 하더라도 실행파일의 크기가 크지 않으므로 문제가 되지 않습니다만, Go언어를 사용하여, 특히 임베디드 환경에서는 몇메가짜리 실행파일이 2~3개가 되면 상당히 부담이 됩니다.


그래서 생각을 해본 것이 busybox처럼 실행파일은 하나로 두어서 공통으로 사용하는 패키지가 어러번 포함되지 않는 방법을 생각해보았습니다.



다음과 같이 하면 간단하게나마 busybox 처럼 실행파일은 하나이나 동작은 여러가지로 할 수 있습니다.


package main

import (
	"os"
	"fmt"
	"path"
)


func main() {
	switch (path.Base(os.Args[0])) {
		case "hello":
			fmt.Println("Hello World");
		case "foo":
			fmt.Println("Bar");
	}
}


go로 빌드를 한 후에 실행파일을 심볼릭 링크를 사용하여


ln -s allinone hello

ln -s allinone foo


이렇게 두개의 심볼릭 링크를 만들어서 실행해보면 다음과 같습니다.


result.png