如何在GO中导入本地包

4
我正在创建一个Web API。
我在同一个文件main.go中构建了我的服务器和控制器。
我创建了另一个名为model.go的文件,在其中声明了一个Person结构体。
我无法在main.go中导出我的模型。
每次运行或构建时,都会收到以下错误:
can't load package: package .: found packages main 

有没有一种方法可以导出函数/常量并在具有良好路径的文件中导入它们?(就像JavaScript的工作方式一样)。

这是我的目录树:

myapp/
  --main.go/
  --model.go/

This is my import: main.go

package main

import (
   "encoding/json"
   "log"
   "net/http"

   "./person"
   "github.com/gorilla/mux"
)

model.go

package person

type Person struct {
   ID        string   `json:"id,omitempty"`
   Firstname string   `json:"firstname,omitempty"`
   Lastname  string   `json:"lastname,omitempty"`
   Address   *Address `json:"address,omitempty"`
}

var people []Person
1个回答

7

在同一个文件夹中,您必须具有相同的包名称。

当golang处理导入时,它会将同一目录下的所有文件作为一个整体加载。

给定您提供的代码,model.go包名称必须是main。

您不需要从main.go导入model.go。

现在,有一件小事要知道。当您运行go build/run/install时,它将获取作为参数传递的文件列表以初始化构建过程。

在您当前的设置中,这意味着您必须将组成主要包的所有文件传递给命令行,否则它们将被忽略,在您的情况下,这意味着构建失败。

简单来说,您将执行go build *.go而不是go build main.go

在未来,如果您想避免多个源文件进行构建,您应该拥有一个独特的main.go,其中只包含最少的代码以初始化您正在编写的程序。因此,model.go的内容将存在于不同的包(目录)中,并通过import xyz语句导入到main中。

最后,import指令的导入路径不能相对于当前工作目录。它们都是基于GOPATH/src的。


1
值得注意的是,导入路径可以是相对路径,但是绝对不应该使用相对导入路径。永远不要使用相对导入路径! - Kaedys
在主包中可能可以,但这是不好的做法。此外,测试将在同一文件夹中使用不同的包名称。 - user4466350
2
测试可以在同一文件夹中使用不同的包名称,但只有在非常特定的模式(packagename_test)下才能使用,并且仅当黑盒测试比白盒测试更有用时才能使用(在大多数情况下,这将导致无法进行适当的单元测试)。 - Kaedys
1
_test 结尾的文件在 go buildgo installgo run 命令中不会被包含。您可以通过以下设置进行验证:https://pastebin.com/xVnsdghE。测试文件中定义的全局变量无法从非测试文件中访问,并且尽管它们位于同一包中,但不会包含在最终构建中。 - Kaedys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接