【问题标题】:How to import local package in GO如何在 GO 中导入本地包
【发布时间】:2017-12-14 11:17:02
【问题描述】:

我正在创建一个 Web API。

我在同一个文件 main.go 中构建了我的服务器和控制器。

我创建了另一个文件名model.go,我在其中声明了一个Person 结构。

我无法在main.go 中导出我的模型。

每次运行或构建时都会出现此错误:

can't load package: package .: found packages main 

有没有办法导出 func/const 并将它们导入到具有良好路径的文件中? (就像 JavaScript 的工作方式一样)。

这是我的树:

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

这是我的导入: ma​​in.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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    当 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

    【讨论】:

    • 值得注意的是,导入路径可以是相对的,但相对导入路径虽然可能,但应该永远不要使用。 永远!
    • ~~在主包中,可能没问题,虽然是不好的做法。此外,测试将在同一文件夹中使用不同的包名称。
    • 测试可以在同一个文件夹中使用不同的包名,但只能使用非常特定的模式(packagename_test),并且只有在黑盒测试比黑盒测试更有用的情况下白盒测试(在大多数情况下,它在功能上排除了适当的单元测试)。
    • _test 结尾的文件不包含在go buildgo installgo run 命令期间。例如,您可以使用以下设置验证这一点:pastebin.com/xVnsdghE。测试文件中定义的全局变量不能从非测试文件中访问,并且不包含在最终构建中,尽管它们在同一个包中。
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2019-10-06
    • 2021-06-17
    • 1970-01-01
    • 2020-09-12
    • 2022-01-08
    相关资源
    最近更新 更多