【问题标题】:Go package not exporting function with capital letterGo包不导出大写字母的功能
【发布时间】:2018-10-16 03:16:20
【问题描述】:

我正在尝试在 Golang 中导入一个包,但是我无法引用包中声明的函数。

以下代码用于我要导入的包。

//image.go
pacakage image
import "pixel"

type Image struct {
    Matrix [][]pixel.Pixel
}

func New(width, height int) *Image{
     //Code
}

以下代码用于主文件

//main.go
pacakage main
import (
    "image"
    "fmt"
)

func main(){
    img := image.New(10,4)
    fmt.Println(img)
}

当我使用 go run main.go 运行 main.go 时,我收到一条错误提示

undefined: image.New

我确保我的函数是用大写字母定义的,所以我不确定为什么我能够调用 New 函数。但是,我可以声明一个新的 image.Image 变量。

编辑:

问题是我在指定的 GOPATH/src 之外进行开发。我在 GOPATH 之外创建了一个文件,并将我的 GOPATH 重置为我的工作文件。这使我无法正确导入和编译我的包。

【问题讨论】:

  • image.go在哪个文件夹中?
  • 在 src 文件夹中我有一个名为 image 的文件夹

标签: go import package


【解决方案1】:

原生库Go "image" package没有任何New方法。

您需要在 $GOPATH 中为您自己的图像包添加项目/路径的名称前缀,以使 Go 选择您自己的包,而不是原生包。

见“Package names

Go 包既有名称又有路径。

包名在其源文件的包语句中指定;客户端代码使用它作为包导出名称的前缀。客户端代码在导入包时使用包路径。
按照约定,包路径的最后一个元素是包名:

import (
    "context"                // package context
    "fmt"                    // package fmt
    "golang.org/x/time/rate" // package rate
    "os/exec"                // package exec
)

OP 补充说:

imagesrc 文件夹中:我有一个名为image 的文件夹。

见“Organizing Go code”:

有时人们将GOPATH 设置为其源代码库的根目录,并将他们的包放在与代码库根目录相关的目录中,例如“src/my/package”。

一方面,这会缩短导入路径(“my/package”而不是“github.com/me/project/my/package”),但另一方面它会中断 go get 并迫使用户重新设置他们的 GOPATH 以使用包。
不要这样做。

【讨论】:

  • 导入包的正确方法是托管存储库并从存储库导入吗?例如,为项目创建一个 github repo 并从 github url 调用包
  • @leme 不托管 repo,只需有一个 local 文件夹 structure 不同于“image”(如GOPATH/src/myproject/image)允许您的代码引用myproject.image.New()。您不必为此创建远程仓库。
猜你喜欢
  • 2016-04-28
  • 2017-03-30
  • 2018-12-22
  • 2014-06-29
  • 1970-01-01
  • 2014-09-17
  • 2014-09-11
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多