質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

1762閲覧

Goの環境構築ができない

aaaa____

総合スコア24

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

1クリップ

投稿2022/06/22 12:14

編集2022/06/23 11:40

質問内容

「Go言語でつくるインタプリタ」という参考書をもとに行っているのですが,

% go test ./lexer

という命令を実行すると

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

というように出力され,実行されません.どこを修正すればよいのでしょうか.

正しい出力は以下のようになるようです.

ok monkey/lexer 0.007s

lexer.go

Go

1package lexer 2 3import "monkey/token" 4 5 6type Lexer struct { 7 input string 8 position int //入力における現在の位置(現在の文字を指し示す) 9 readPosition int //これから読み込む位置(現在の次の文字) 10 ch byte //現在検査中の文字 11} 12 13func New(input string) *Lexer { 14 l := &Lexer{input: input} 15 l.readChar() 16 return l 17} 18 19func (l *Lexer) readChar() { 20 if l.readPosition >= len(l.input) { 21 l.ch = 0 22 } else { 23 l.ch = l.input[l.readPosition] 24 } 25 l.position = l.readPosition 26 l.readPosition += 1 27} 28 29func (l *Lexer) NextToken() token.Token { 30 var tok token.Token 31 32 switch l.ch { 33 case '=': 34 tok = newToken(token.ASSIGN, l.ch) 35 case ';': 36 tok = newToken(token.SEMICOLON, l.ch) 37 case '(': 38 tok = newToken(token.LPAREN, l.ch) 39 case ')': 40 tok = newToken(token.RPAREN, l.ch) 41 case ',': 42 tok = newToken(token.COMMA, l.ch) 43 case '+': 44 tok = newToken(token.PLUS, l.ch) 45 case '{': 46 tok = newToken(token.LBRACE, l.ch) 47 case '}': 48 tok = newToken(token.RBRACE, l.ch) 49 case 0: 50 tok.Literal = "" 51 tok.Type = token.EOF 52 } 53 l.readChar() 54 return tok 55} 56 57func newToken(tokenType token.TokenType, ch byte) token.Token { 58 return token.Token{Type: tokenType, Literal: string(ch)} 59} 60

現状1

MacOSで,ディレクトリ構成は以下のようになっています.

~/Go/monkey/lexer

monkeyディレクトリ,lexerディレクトリで上記の命令を実行しても同じ文が表示されます.

現状2

,以下に示す,hello.goを次のように命令した場合はきちんと望み通りの出力が出てきます.

Go

1package main 2 3import "fmt" 4 5func main() { 6 fmt.Printf("hello, world\n") 7}
% go run hello.go hello, world

やったこと

やったこと

・Homebrewのインストール
https://brew.sh/index_ja

・% brew -v
Homebrew 3.5.2
で入ったことの確認

・% brew install direnv
でdirenvのインストール

・~/.zshrcに
export GOPATH=$HOME/go
export EDITOR=vi
eval "$(direnv hook bash)"
を書き込む

・source .zshrc

https://qiita.com/hinastory/items/336c2d944fdb8ae11efb
を確認したがあまり対処方法がわからなかった.

追記

.zshrcに次のものを書き加えた.

export GO111MODULE=off

こののち,実行してみると以下のようになりました.

monkey % go test ./lexer found packages main (hello.go) and lexer (lexer.go) in /Users/SSS/Go/monkey/lexer lexer/lexer.go:4:2: cannot find package "monkey/token" in any of: /usr/local/go/src/monkey/token (from $GOROOT) /Users/SSS/go/src/monkey/token (from $GOPATH)

packageが見つからないのは何故?
tokenディレクトリはmonkeyディレクトリの下,つまりlexerディレクトリと同じ階層にあります.

~/Go/monkey/lexer, token

追記2

vscode上でそもそも
import "monkey/token"
がエラーとして強調されていて

could not import monkey/token (cannot find package "monkey/token" in any of /usr/local/go/src/monkey/token (from $GOROOT) /Users/SSS/go/src/monkey/token (from $GOPATH))

となっているが,これはなぜなのでしょうか.
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/06/22 12:33

「Go言語でつくるインタプリタ」(の原書)は Go Modules が正式導入される前に執筆されましたので、 export GO111MODULE=off としておくとよいかもしれません。
aaaa____

2022/06/22 12:41

ご回答ありがとうございます. ~/.zshrcにという認識であっていますでしょうか. 試しに.zshrcに記述し,source .zshrcをしたのち,実行してみたところ次のようになりました ``` monkey % go test ./lexer found packages main (hello.go) and lexer (lexer.go) in /Users/SSS/Go/monkey/lexer lexer/lexer.go:4:2: cannot find package "monkey/token" in any of: /usr/local/go/src/monkey/token (from $GOROOT) /Users/SSS/go/src/monkey/token (from $GOPATH) ```
melian

2022/06/22 13:18

一応、原書の著者がコードを公開してくれています。 https://interpreterbook.com/waiig_code_1.3.zip 中身を眺めると、direnv を利用して GOPATH を適切に設定する様な構成になっています。こちらをダウンロードして試してみてはどうでしょうか。
aaaa____

2022/06/23 11:01

全部の章をダウンロードしてやってみましたが同じような結果になってしまいました.
guest

回答1

0

ベストアンサー

GO111MODULE=offをしてしまうとGOPATH配下にプロジェクトを置くことが必須となります。
が、今後Goを使っていく上ではGoモジュールの仕組みを知っておいたほうが良いです。

つまり、GO111MODULE=offすることなく最初のエラーメッセージに対応することがおすすめです。
Goモジュールを使うとGOPATH配下にプロジェクトを置くことが必須ではなくなります。

今回の場合、具体的にはmonkeyパッケージのあるフォルダにてgo mod init monkeyとしてみてください。
この場合、monkey/lexerというインポートパスでmonkeyパッケージフォルダの下のlexerフォルダのパッケージをインポートできるようになります。(これでちゃんと解決するかどうかは実際のフォルダ構成を示してもらわないとはっきりとはわかりませんが)

追記

配布ソースのzipを解凍し、以下の操作でテストが実行できることを確認しました。

shell

1>cd waiig_code_1.3/01/src/monkey 2>go mod init monkey 3go: creating new go.mod: module monkey 4go: to add module requirements and sums: 5 go mod tidy 6>go mod tidy 7>go test ./lexer 8ok monkey/lexer 0.240s

go env GO111MODULEの結果が何も表示されないのを確認しましょう(初心者のうちはほとんどの環境変数をいじらないように)。

投稿2022/06/22 21:56

編集2022/06/23 12:15
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaa____

2022/06/23 11:45 編集

ご回答いただきありがとうございます. ご指摘いただいた通り,.zshrcからGO111MODULE=offを取り除いたのち,source .zshrcで適用させ,monkeyフォルダにて ``` go mod init monkey ``` を実行し, ```go test ./lexer``` をmonkeyディレクトリで実行してみたところ, ``` monkey % go test ./lexer main module (monkey) does not contain package monkey/lexer ``` のように出力されました. 配布されている著者の書いたコードでは一応monkeyディレクトリにmain.goのファイルは存在しますが,参考書の手順ではまだ出てきていないので,なくても質問内容で書いた出力が出てくるはずなのですが,なぜ含まれていないとなってしまうのでしょうか. また,その著者のコードをコピペしてmonkeyディレクトリにmain.goとして置いたのですが同じ結果が出力されました. ファイルの構成は,質問の「現状1」,「追記1」,「追記2」に書いてある通りとなっています. よろしくお願いいたします.
aaaa____

2022/06/23 12:58

配布ソースコードでは自分も正しく動作したので,そのファイル構成を真似たのち,配布されている.envrcを複製し配布物と同じディレクトリに置いてみたところ,きちんと実行することができました,ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問