func InstallMissing(bin, getPath, importPath string) (string, error) {
	if b, err := FindBin(bin); err == nil {
		return b, nil
	}
	if data, err := exec.Command("go", "get", getPath).CombinedOutput(); err != nil {
		return "", fmt.Errorf("failed to get %s: %v: %s", importPath, err, string(data))
	}
	if data, err := exec.Command("go", "install", importPath).CombinedOutput(); err != nil {
		return "", fmt.Errorf("failed to install %s: %v: %s", importPath, err, string(data))
	}
	b, err := FindBin(bin)
	if err != nil {
		return "", fmt.Errorf("failed to lookup %v after install: %v", bin, err)
	}
	return b, nil
}
InstallMissing runs go get getPath and then go get importPath
if bin cannot be found in the directories contained in the PATH environment variable.
It returns the path to the installed binary on success.
package checkers
import (
	"fmt"
	"go/build"
	"io/ioutil"
	"os/exec"
	"path/filepath"
	"strings"
	"syscall"
	"sync"
	"os"
)
func Error(errs ...string) error {
	if len(errs) == 0 {
		return nil
	}
	return errorList(errs)
}
type errorList []string
func (e errorList) Errors() []string { return []string(e) }
func (e errorList) Error() string    { return strings.Join(e, "\n") }
func packageDir(path string) (string, error) {
	pkg, err := build.Import(path, ".", build.FindOnly)
	if err != nil {
		return "", fmt.Errorf("import failed: %s: %v", path, err)
	}
	return pkg.Dir, nil
}
func FindBin(bin string) (string, error) {
	if _, err := exec.LookPath(bin); err == nil {
		return bin, nil
	}
	srcDirs := build.Default.SrcDirs()
	for _, src := range srcDirs {
		binFile := filepath.Join(filepath.Dir(src), "bin", bin)
		if _, err := exec.LookPath(binFile); err == nil {
			return binFile, nil
		}
	}
	return "", fmt.Errorf("failed to find binary: %v", bin)
}