JIngles123头像
关注

Go 本地包无法正常导入和运行的解决办法

问题如题,本地新建一个pack文件夹,简单的创了几个demo程序,准备学习Go的本地包导入,发现总失败,一番折腾后,总算解决并长经验了,故记录下。
问题太多,有的问题还很低级,但作为初学者的我,直面并将其捋清,是我必须要做的。

背景:

项目中有一个入口程序和一个自定义包文件:

  79_pack/
  ├── 入口文件.go
  └── pack1.go

pack1.go 内容如下:

package pack1

var Pack1Int = 42
var Pack1Float = 3.14

func ReturnStr() string {
    return "Hello World!"
}

入口程序尝试导入并使用 pack1:

package main

import (
    "fmt"
  	"./pack1"
)

func main() {
    test1 := pack1.ReturnStr()

  	fmt.Printf("ReturnStr from package1: %s\n", test1)
  	fmt.Printf("Integer from package1: %d\n", pack1.Pack1Int)
  	fmt.Printf("Float from package1: %f\n", pack1.Pack1Float)

  	test2 := ReturnStr()
  	fmt.Printf("Float from package1: %f\n", Pack1Float)
}

go run时报go: cannot find main module,。
在这里插入图片描述

原因:

1、不同包的文件放在了同一个目录
入口文件属于: package main
pack1.go 属于:package pack1
Go 通常要求一个目录只包含一个包,因此 main 和 pack1 应分别放在不同目录中。

2、导入路径对应的是目录
入口文件里的导入语句:import “./pack1” 表示导入当前目录下的 pack1 子目录,而不是导入 pack1.go 文件。而当前只有 pack1.go 文件,并不存在 pack1 目录。

3、模块模式不支持相对导入
现代 Go 项目通常使用模块模式。模块模式下不能使用:
import “./pack1”
应使用完整的模块路径:
import “example.com/packdemo/pack1”

4、点导入和普通调用方式混用
点导入写法:
import . “example.com/packdemo/pack1”
使用点导入后,应直接调用:
ReturnStr()
Pack1Int
Pack1Float
不能再使用:
pack1.ReturnStr()

5、局部变量没有使用
下面的变量声明后没有被使用:
test2 := ReturnStr()
Go 不允许存在未使用的局部变量,因此也会导致编译失败。

解决步骤:

第一步:为自定义包创建目录

执行命令以调整目录结构:

$ cd xxx/79_pack/
$ mkdir pack1
$ mv pack1.go pack1/pack1.go

79_pack/
  ├── 入口文件.go
  └── pack1/
      └── pack1.go
第二步:初始化 Go 模块

在项目根目录执行以生成go.mod:

$ cd xxx/79_pack/
$ go mod init golearning/79_pack

golearning/79_pack 可调整成自己有意义的名称,生成的 go.mod 内容如截图所示。

在这里插入图片描述

第三步:使用模块路径导入包

建议使用普通导入方式(也可以调整成点导入),将入口程序修改为:

package main

import (
    "fmt"
  	"golearning/79_pack/pack1" // 模块名+文件夹名
) // pack1为本地包.go里定义的package名

func main() {
    test1 := pack1.ReturnStr()

  	fmt.Printf("ReturnStr from package1: %s\n", test1)
  	fmt.Printf("Integer from package1: %d\n", pack1.Pack1Int)
  	fmt.Printf("Float from package1: %f\n", pack1.Pack1Float)
  }
第四步:格式化代码(可忽略)

执行命令:

$ cd xxx/79_pack/
$ go fmt ./...
第五步:运行程序

在包含 go.mod 的项目根目录执行:

$ cd xxx/79_pack/
$ go run .

在这里插入图片描述
至此,一个简单的本地包导入问题得以解决。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_40467670/article/details/166488378

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--