LoginSignup
6
5

More than 3 years have passed since last update.

書籍「Go言語でつくるインタプリタ」の進行で躓いたところ

Posted at

はじめに

書籍「Go言語でつくるインタプリタ」を進めていたところ、序盤(1.3節)から躓いたので解決方法をメモしておこうと思います。
なお、go言語の開発で本来とるべき構成などとは異なっている可能性がありますが、あくまでこの書籍をすすめるための対処となりますのでご了承ください。

1章3節でビルド結果が違う

1.3節をすすめていると、テストコードのビルドの際に紙面では「New関数が定義されていないのでエラーが発生する」、という段取りのはずが

想定
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL    monkey/lexer [build failed]
FAIL

テストコードの中で指定している「パッケージ"monkey/token"が見つからない」と出たところで異常に気づきました。

実際
lexer\lexer_test.go:6:2: cannot find package "monkey/token" in any of:
        c:\go\src\monkey\token (from $GOROOT)
        C:\Users\Hoge\go\src\monkey\token (from $GOPATH)
FAIL    _/C_/Users/Hoge/source/repos/monkey/lexer [setup failed]
FAIL

そもそもgoのパスを通していなかった。

自作したモジュールを使用してコーディングを進めていくので、そのモジュールまでのパスが通っていなければいけないはずですが、golangのインストールの際に設定される環境変数GOPATHをそのままにしていました。

パスに\srcが付け足される。

エラーメッセージの展開後パスから、プロジェクトのソースコードはsrcフォルダの下にあることが想定されていることがわかりました。(パスとモジュール指定の間に\srcが挿入されて展開されるため、見つからない、というエラーになる)
多分goのリファレンスからきちんと入っていればこのようなことは起こらなかったのでしょうが、当のインタプリタ書籍から入ったので全くわかりませんでした。

対処

結論として、以下のようにフォルダ構成と環境変数を設定することで書籍の内容進行に対応しました。

フォルダ構造

以下のような構造に修正しました。

\Users\UserName\source\repos\
monkey\
  + src\
    + monkey\      (<- 「go test位置」)
      + lexer\
      | + lexer_test.go
      | + (lexer.go)
      | 
      + token\
        + token.go

(筆者はVisual Studioのプロジェクトフォルダの生成場所の法則によせて、\Users\UserName\source\repos\フォルダの下に各プロジェクトのフォルダを作成しています。)

環境変数

環境変数のGOPATHに以下を追加しました。

%USERPROFILE%\source\repos\monkey  # USERPROFILEは \Users\Hogeに展開される

go test(テスト実行)コマンドを通すには

書籍どおりのテストコード実行を行うにはmonkey\プロジェクトフォルダのsrc\monkey\にフォルダ移動してからになります。
(上図のフォルダ構成の 「go test位置」)

想定通り
C:\Users\Hoge\source\repos\monkey\src\monkey>go test ./lexer
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL    monkey/lexer [build failed]
FAIL

まとめ

以下の様に対処して、「Go言語でつくるインタプリタ」1.3節をいなしました。

  • フォルダ構成の見直し
  • 環境変数の追加
  • go test実行時のフォルダ位置

以上です。

6
5
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
6
5