概要
「Go言語でつくるインタプリタ」の1.3字句解析器を実行中にエラーで躓いたので備忘録
対象者は
- 解析のためにこの本を買ったけどgo言語がわからずに躓いた人
- go言語のインポート関係で躓いてる人
環境
win11
go 1.18
書籍に記載のあったdirenvは未使用
エラー内容
lexer_test.goで以下のエラー。ヒントで隠れてるのでコードを以下に記載。
import (
"testing"
"monkey/token"
)
解決方法
shellで
#PROJECT_NAMEじゃなくてもなんでもいいかも
go mod init PROJECT_NAME(サンプルプログラム試しているルートフォルダ)
その後import文のmonky/tokenをプロジェクトルートを含めたパスにしてください。
なんで動かなかったのか
2021年2月にgo言語はver1.16がリリースされました。
その時に環境変数であるGO111MODULEのデフォ値がautoからONになりました。
Go言語にはモジュールのインポート方法にモジュール対応モードとGOPATHモードがありまして、
- GO111MODULE=ON(モジュール対応モード)
- go.modにかかれたものをもとにインポート
- GO111MODULE=OFF(GOPATHモード)
- GOPATHに指定されたディレクトリをもとにインポート
- GO111MODULE=auto
- go.modがあればONのときの挙動、なければOFFの挙動
この本の場合だとおそらくGO111MODULE=autoの挙動を想定していたのですが、アプデによって動かなくなった、ということだと思います。
(この本の初版は2018年6月のため、おそらくコードが古い)
また、go言語では相対パスではなくてプロジェクトルートフォルダ(go.modのあるディレクトリ)を基準とした絶対パスが推奨されています。
参考URL
GO111MODULEについて
https://text.baldanders.info/golang/manage-modules/
相対パスについて
https://teratail.com/questions/297324
https://selegee.com/7188/