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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Go

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Q&A

解決済

Golangでcould not import(no package for import)というエラーでインポートができない

noa-1129
noa-1129

総合スコア25

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Go

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

1回答

0グッド

0クリップ

12105閲覧

投稿2020/10/11 09:23

編集2020/10/11 09:40

前提・実現したいこと

golang(gin)/vue/mysqlでSPAを作っている際、entityのインポートでエラーが出てしまいます。

パッケージ構成

golang_spa │ server.go │ ├─controllers │ └─controller │ productController.go │ ├─models │ ├─db │ │ productDb.go │ │ │ └─entity │ Product.go │ └─views ├─css │ product.css │ ├─js │ vueProduct.js │ └─static index.html

発生している問題・エラーメッセージ

{ "resource": "/Users/noay/program/golang/golang_spa/controllers/controller/productController.go", "owner": "_generated_diagnostic_collection_name_#0", "severity": 8, "message": "could not import ../../models/entity (no package for import ../../models/entity)", "source": "compiler", "startLineNumber": 11, "startColumn": 9, "endLineNumber": 11, "endColumn": 30 }

該当のソースコード

golang

1package controller 2 3import ( 4 // 文字列と基本データ型の変換パッケージ 5 strconv "strconv" 6 7 // Gin 8 "github.com/gin-gonic/gin" 9 10 // エンティティ(データベースのテーブルの行に対応) 11 entity "../../models/entity" 12 13 // DBアクセス用モジュール 14 db "../../models/db" 15) 16 17// 商品の購入状態を定義 18const ( 19 // NotPurchased は 未購入 20 NotPurchased = 0 21 22 // Purchased は 購入済 23 Purchased = 1 24) 25 26// FetchAllProducts は 全ての商品情報を取得する 27func FetchAllProducts(c *gin.Context) { 28 resultProducts := db.FindAllProducts() 29 30 // URLへのアクセスに対してJSONを返す 31 c.JSON(200, resultProducts) 32} 33 34// FindProduct は 指定したIDの商品情報を取得する 35func FindProduct(c *gin.Context) { 36 productIDStr := c.Query("productID") 37 38 productID, _ := strconv.Atoi(productIDStr) 39 40 resultProduct := db.FindProduct(productID) 41 42 // URLへのアクセスに対してJSONを返す 43 c.JSON(200, resultProduct) 44} 45 46// AddProduct は 商品をDBへ登録する 47func AddProduct(c *gin.Context) { 48 productName := c.PostForm("productName") 49 productMemo := c.PostForm("productMemo") 50 51 var product = entity.Product { 52 Name: productName, 53 Memo: productMemo, 54 State: NotPurchased, 55 } 56 57 db.InsertProduct(&product) 58} 59 60// ChangeStateProduct は 商品情報の状態を変更する 61func ChangeStateProduct(c *gin.Context) { 62 reqProductID := c.PostForm("productID") 63 reqProductState := c.PostForm("productState") 64 65 productID, _ := strconv.Atoi(reqProductID) 66 productState, _ := strconv.Atoi(reqProductState) 67 changeState := NotPurchased 68 69 // 商品状態が未購入の場合 70 if productState == NotPurchased { 71 changeState = Purchased 72 } else { 73 changeState = NotPurchased 74 } 75 76 db.UpdateStateProduct(productID, changeState) 77} 78 79// DeleteProduct は 商品情報をDBから削除する 80func DeleteProduct(c *gin.Context) { 81 productIDStr := c.PostForm("productID") 82 83 productID, _ := strconv.Atoi(productIDStr) 84 85 db.DeleteProduct(productID) 86} 87

試したこと

・タイプミスの確認

・ディレクトリ構成の確認

・go toolsのアップデート

・下記の確認

"go.toolsEnvVars":{ "GO111MODULE":"on", }

・コードの打ち直しやエディタの再起動などを試していると、他ディレクトリのentityのインポートー文にエラーが移ったりもしてよくわかりません????

補足情報(FW/ツールのバージョンなど)

vue@2.6.12

・go version go1.15.2 darwin/amd64

・gin v1.6.3

・mysql Ver 8.0.21 for osx10.15 on x86_64 (Homebrew)

参考記事(ソースコード)

Go/Gin/MySQLでSPAを開発(ソースコード)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

gentaro

2020/10/11 09:36

EntityFrameworkのタグは無関係なんで外しましょう。
noa-1129

2020/10/11 09:40

ご指摘ありがとうございます。気をつけます!

回答1

1

ベストアンサー

参考にされたコードも質問者もお勧めしない「相対パスインポート」を使っています。

GO111MODULE=offでなければ相対インポートはできません。
Goでは相対パスによるインポートはもう使わない方が良い状況です。
リポジトリルートにGoモジュール名を付与して
Goモジュール名をルートにした絶対パスを利用するようにしましょう。

例:

shell

1cd golang_spa 2go mod init golang_spa # モジュール名を付与(推奨は「ドメイン/ユーザー名/モジュール名」)

インポートの書き方は以下のような書き方で「.(ドット)」や「..」をパス名に使わないようにしましょう。

go

1import ( 2 "golang_spa/controllers/controller" 3 "golang_spa/models/entity" 4)

投稿2020/10/11 12:07

nobonobo

総合スコア3259

noa-1129👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

noa-1129

2020/10/11 12:49

回答ありがとうございます!相対パス、絶対パスについては名前はみれど意識したことがなかったのでしっかり勉強しようと思います!ちなみに、今回のようにgithub.com/username/modulesnameなどを推奨しているのを見かけますが、どういった理由からなのかもお伺いしたいです!
nobonobo

2020/10/11 13:30

リポジトリURLと合致させることがモジュールの公開の条件です。 公開する予定がない場合はURLにする必要はないだけです。 ただ、相対パスはもともと非推奨でしたが使うことはできていました。 しかし、Goモジュールモードになってからはエラーになるので使うことはできません。
noa-1129

2020/10/11 13:37

重ねての質問の回答ありがとうございます!参考になりました!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Go

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。