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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Go

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

Q&A

解決済

2回答

1607閲覧

Golng 作成したパッケージをインポートできない。

saito5940

総合スコア63

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Go

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

0グッド

1クリップ

投稿2022/05/05 22:24

環境:Windows10 pro
VSCODE
go 1.17.7
初学者です。

プロジェクトを作成してその下にmylibディレクトリ、さらにその下にsubというディレクトリを作りそこにgo関数置き。
main関数で呼び出すことをしました。
Project名----
|-----mylib
| |--under
| |
| sub.go
main.go

main.go

package main import ( "AWESOMEPROJECT/mylib" "AWESOMEPROJECT/mylib/under" "fmt" ) func main() { s := []int{1, 2, 3, 4, 5} fmt.Println(mylib.Average(s)) mylib.Say() under.Hello() }

mylibの下にもgoファイルがあり、それは認識して呼び込んでくれるのですが、さらに下の階層のunderはエラーになります。

PS C:\Users\User\Desktop\awesomeProject> go run main.go main.go:4:2: package AWESOMEPROJECT/mylib is not in GOROOT (C:\Program Files\Go\src\AWESOMEPROJECT\mylib) package command-line-arguments imports AWESOMEPROJECT/mylib/under imports AWESOMEPROJECT/mylib/under: import cycle not allowed

go.modファイルは以下になります。

module AWESOMEPROJECT go 1.17

下の階層のgoファイルを呼び出すにはどうしたら良いのでしょうか?

以下を参考にしました。
[GO言語]GOPATH以外の場所でのimportの挙動について整理
Go 1.16環境構築(Windows)
GOMODULE--Goのパッケージ管理

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

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

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

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

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

guest

回答2

0

将来、3階層とか4階層とかディレクトリを作りコードを書くことはありません。
2階層までは正常に動作するので、初学者としてこれで満足したいと思います。
大変勉強になりました。ありがとうございます。

投稿2022/05/06 15:08

saito5940

総合スコア63

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

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

0

ベストアンサー

そのエラーメッセージは「循環インポートは許可されていません」とお知らせしています。
コードが伏せられているので詳細は分かりませんが、
パッケージの依存関係を図示したときに循環状態が生まれている場合にこういうエラーになります。

循環状態の例:

  • AがBをインポート
  • BがAをインポート

これはインポート依存を矢印で図示してみるとAー>Bー>Aー>Bー>・・・と延々と終端にたどり着けない状態を指します。

既存の言語とGoの違い

既存の言語処理系では循環インポートをエラーとしないものが多いのですが、
これはコンパイル時間を遅くすることや、コードから本質的な依存関係を
把握しにくくなるということでGoではエラー扱いにするという仕様を採択しています。

なので、解決するには循環インポートしている実装を循環しないようにするしかありません。

解決案

  • 解決案1(初心者向け):パッケージの分割をやめてまとめる
  • 解決案2:局所的な依存定義をさらに別のパッケージに分割

解決案1の解説

例えばAパッケージにa1、a2の定義が書かれていて、Bパッケージにb1、b2の定義が書かれているとして、
a1がa2とb1を利用したい、b2がa2を利用したい実装があるとすると、この状況をそのまんま実装するとAとBの循環インポートが生まれます。
そこでAパッケージにa1、a2、b1、b2の定義を全部入れ込んでしまうと循環参照は発生しなくなります。
ちなみにファイルは分割されていてもよくて、同じフォルダに多くのファイルを詰め込むという解決方法です。

解決案2の解説

例えばAパッケージにa1、a2の定義が書かれていて、Bパッケージにb1、b2の定義が書かれているとして、
a1がa2とb1を利用したい、b2がa2を利用したい実装があるとすると、この状況をそのまんま実装するとAとBの循環インポートが生まれます。
こういう時、a2の定義をCパッケージとして分離すると、A->C、A->B->Cという依存関係になり循環しなくなります。

投稿2022/05/06 00:05

編集2022/05/06 00:26
nobonobo

総合スコア3367

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問