Go 戈朗进口包装

Go 戈朗进口包装,go,importerror,Go,Importerror,我对Golang和包裹有一些问题。我有那套衣服 src/ ├── hello_world │   ├── hello.go │   └── math │   └── add.go hello.go文件包含以下代码: package main import ( "fmt" math "hello_world/math" ) func main() { fmt.Println("Hello World") x := math.add(6, 5) } 和

我对Golang和包裹有一些问题。我有那套衣服

src/
├── hello_world
│   ├── hello.go
│   └── math
│       └── add.go
hello.go文件包含以下代码:

package main

import (
    "fmt"
    math "hello_world/math"
)

func main() {
    fmt.Println("Hello World")
    x := math.add(6, 5)
}
add.go

package math

func add(x, y int) int {
    return x + y
}
当我运行hello go时,我看到:

evgen@laptop:~/go/src/hello_world$ go run hello.go 
# command-line-arguments
./hello.go:10: cannot refer to unexported name math.add
./hello.go:10: undefined: "hello_world/math".add
GOPATH

evgen@laptop:~/go/src/hello_world$ echo $GOPATH
/home/evgen/go

如何修复它?谢谢你

在包外部,只能访问和引用导出的标识符,即以大写字母开头的标识符

因此,最简单的修复方法是导出
math.go中的
add()
函数,将其名称更改为
add()

func Add(x, y int) int {
    return x + y
}
x := math.Add(6, 5)
当然,当您从
main.go中引用它时:

func Add(x, y int) int {
    return x + y
}
x := math.Add(6, 5)
另外,请注意,在导入您的
hello\u world/math
包时,您不必指定新名称来引用其导出的标识符:默认情况下,它将是其导入路径的最后一部分,因此这相当于您的导入:

import (
    "fmt"
    "hello_world/math"
)

当在主函数中调用Add时,不要使用这个

x := math.Add(6 + 5)
x := math.Add(6, 5)
用这个代替

x := math.Add(6 + 5)
x := math.Add(6, 5)

来自不同包的函数、变量和任何内容都必须以大写字母开头,以便在导入主包时可见

例如:

package main

import "fmt"
import "other/out"

func main(){

fmt.Println(out.X)

// hello

}

将程序包中希望其他函数读取的函数大写:

func Add(x, y int) int {
      return x + y
}
然后叫它“你好”。像这样说:

x := math.Add(6, 5)

将它们保持小写确实有其目的,特别是如果您想保护它不被无意中用在软件包之外。

您可以编辑其他用户的答案,而不是发布一个新的答案来更正另一个答案