天天看點

Go導入不同目錄下包報錯解決辦法

一次正确的配置

結果檔案結構

這是操作完畢後的完整檔案結構樹狀圖,接下來将帶大家一步一步完成它

特别注意!入口檔案

main.go

go.mod

在同一目錄下!這一點必須要保證!

└─gindemo.com
    │  go.mod
    │  go.sum
    │  main.go
    │
    ├─.idea
    │      .gitignore
    │      gindemo.com.iml
    │      modules.xml
    │      workspace.xml
    │
    └─src
        └─Chapter1
                C1.go
           

建立項目

該項目建立使用goland2020

任選一個檔案夾建立目錄,注意項目的名字最好依照這個格式:

xxx.xxx

點号的字尾随便寫,隻要保證上面這樣的格式就好了

我們建立一個項目

gindemo.com

此時打開 goland 的設定頁面,設定好

GOROOT

GOPATH

設定過程請參考 gin 相關文章!

建立檔案 main.go (和 go.mod 同目錄)

// 入口點入口點!!!必須要main!!!别忘了求求你了
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	app := gin.Default()

	app.GET("/shit", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"error": "shit",
		})
	})

	app.Run(":10086")
}
           

這是一個最簡單的 gin 後端,因為我們之前配置好了

GOPATH

,是以這裡 goland 會為我們自動導包,故不會出現飄紅現象!

但實際上

go.mod

内部依然沒有配置依賴,我們需要在項目目錄下打開指令行,輸入

go mod tidy

為我們自動處理好依賴關系;

此時配置好運作參數直接運作 main 方法就可以開啟我們的後端服務了

不同檔案夾下導包

建立檔案(大小寫不是必要的)

src/Chapter1/C1.go

代碼不是重點,我們要做的是在

main.go

裡面使用該檔案的

BindDemo

方法

方法名需要大寫開頭!

package Chapter1

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

...

func BindDemo(c *gin.Context) {
	...
}
           

來到我們的 go.mod

來分析一下最關鍵的三行内容

  1. 第一行即 gomod 管理的所在包名稱
  2. 第二行即 go 版本
  3. 第三行及剩餘行即導入的依賴
module gindemo.com

go 1.19

require github.com/gin-gonic/gin v1.8.2
           

此時記下我們

go.mod

管理的包名叫做:

gindemo.com

(其實就是咱們的項目名)

打開 main.go 修改代碼為

package main

import (

    // 這表示取别名,用小寫字母c代表後面導入的内容
	c "gindemo.com/src/Chapter1"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	app := gin.Default()

	app.GET("/shit", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"error": "shit",
		})
	})

    // 在這裡調用 C1.go 檔案内的方法
	app.GET("/c1",c.BindDemo)

	app.Run(":10086")
}
           

我們來分析一下 import 裡面這行代碼的含義:

c "gindemo.com/src/Chapter1"

  1. 小寫字母 c,表示給後面的包取個别名,我們之後直接使用 c 來調用
  2. 導包絕不可以使用相對路徑,必須要用 go.mod 裡面 module 行給出的路徑打頭,然後依次索引到我們的檔案
  3. 這裡是直接導入 Chapter1 整個包,也即導入其所擁有的所有 go 檔案
此時你發現 goland 直接飄紅,但這不是我們的問題!直接運作是可以跑起來的!
由于我們直接導入 Chapter1 整個包,是以按照我們定的别名 c ,直接調用方法即可使用!

繼續閱讀