LoginSignup
15
12

More than 3 years have passed since last update.

Go言語(1.13)で自作ライブラリをimportする

Posted at

この記事について

対象:Go言語初学者向け

Go言語に自作ライブラリをimportするときに新旧の情報が混ざっていて結局どういうやり方がいいのかよくわからなかったので調べた。
バージョンが変わって色々と変わっているらしく、今後も変わりそう。

実行環境

MacOS Mojave 10.14
Go言語(Golang) 1.13
VisualStudioCode 1.40

結論

Go1.11からはGo Modulesを使いましょう。
Go1.10以前は$GOPATH配下に全て置くしかなさそう。
相対パスも環境によっては実行できるが非推奨。

やりたいこと

下記の構成で自作のライブラリをmainからimportしたい。

ディレクトリ構成

newmod/
├── lib
│   └── lib.go
└── main.go

テスト用ソース

main.go
package main

import (
    "fmt"
    "newmod/lib"
)

func main() {
    s1 := "abc123-~アイウ|"
    s2 := "abc123-~アイウ|"
    fmt.Println(s1)
    ns := lib.Convert(s2)
    fmt.Println(ns)
}
lib.go
package lib

import "golang.org/x/text/width"

func Convert(s string) string {
    return width.Narrow.String(s)
}

このままだとimportエラーが発生するのでGo Modeluesを設定する。

やったこと

下記の記事を参考にGo Modeluesを設定。
https://techblog.asahi-net.co.jp/entry/2019/03/11/122341#Modules%E3%81%AE%E5%B0%8E%E5%85%A5

$ cd newmod
$ go mod init newmod

上記のコマンドを実行するだけ。
実行するディレクトリに注意する。(ここを間違ってハマった...)

結果

go.modができてここでライブラリ(モジュール)を管理するようになる。
GOPATHを設定しなくてもgo.modがあるディレクトリにパスが通るようになって自作ライブラリもnewmodディレクトリからのパス指定でimportできるようになった。

newmod/
├── go.mod
├── go.sum
├── lib
│   └── lib.go
└── main.go
go.mod
module newmod

go 1.13

require golang.org/x/text v0.3.2

Goのライブラリ管理についてわかったこと

Go1.11からライブラリ管理方法として、Go Modeulesというものが導入されていて、現バージョンのGo1.13ではGo Modulesが推奨されているらしい。
Go1.10以前のバージョンではGOPATHという環境変数を設定して$GOPATH/srcの配下で開発することが前提になっていたが色々問題があった模様。

現状、新旧のGoバージョンでの情報が混在しているのでGOPATHを設定しろ、みたいなことが書かれているが、最新のGo言語はそもそもGOPATHがデフォルトで設定されないのでこれからはGoModulesで管理するのが無難かなと。

参考記事

Go Modules
https://qiita.com/propella/items/e49bccc88f3cc2407745
The Go Blog - Using Go Modules / Go Modulesを使う(和訳)
https://qiita.com/pokeh/items/139d0f1fe56e358ba597

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12