tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【go】go言語でgopathを使わずpackageをローカル インポートするメモ - ちょろっとスクリプトでcannot find packageと怒られる時

はじめに

go言語でちょっとだけコード試したい時に、
任意のディレクトリに以下のような構成で実行すると cannot find package と言われることがあります

先にやり方を書いてしまうと相対パス指定することでインポートが可能となります。

構成
$ tree
.
├── main.go
└── sample01
    └── sample01.go
コード
  • main.go
package main

import (
  "fmt"

  "sample01/sample1"
)

func main() {
  s1 := sample01.HelloWorld("hoge")
  fmt.Println(s1)
}
  • sample01/sample01.go
package sample01

func HelloWorld(s string) string {
  return "hello world, " + s
}

実行してみる

実行するとcannot find packageと怒られます

main.go:4:2: cannot find package "sample01/sample01" in any of:
  /usr/local/Cellar/go/1.6.2/libexec/src/sample01/sample01 (from $GOROOT)
  /Users/hoge/go-test-sample/src/sample01/sample01 (from $GOPATH)

解決方法

冒頭でも書いている通り、import宣言を相対パスで書くだけです。

コード

  • main.goのimport宣言だけ変更
package main

import (
  "fmt"

  "./sample01"
)

func main() {
  s1 := sample01.HelloWorld("hoge")
  fmt.Println(s1)
}

実行してみる

$ go run main.go 
hello world, hoge

補足

あくまでもちょろっと試したい時用で、相対パスでのpackage指定はお勧めされないので注意

  • 毎度pkg化することになるのでコンパイルが遅い
  • 他人が普通にgo getできない

引用: Golangで自分自身で定義したパッケージをインポートする方法あれこれ

おわり

てっきりgopathに追加するものだとばかり思い込んでいると
相対パスでインポートしようという頭がなかったので目からうろこでした\(^o^)/