Golang 导入包

Golang import packages

我对 Golang 和 include 包有一些问题。我有那个结构

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
}

当我这样做时 go run 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.add() 函数,方法是在 math.go 中将其名称更改为 Add():

func Add(x, y int) int {
    return x + y
}

当然,当您从 main.go 中引用它时:

x := math.Add(6, 5)

附带说明一下,请注意,在导入 hello_world/math 包时,您不必指定新名称来引用其导出的标识符:默认情况下,它将是导入的最后一部分路径,因此这相当于您的导入:

import (
    "fmt"
    "hello_world/math"
)

并且在你的主函数中调用 Add 时,不要使用这个

x := math.Add(6 + 5)

改用这个

x := math.Add(6, 5)

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

示例:

package main

import "fmt"
import "other/out"

func main(){

fmt.Println(out.X)

// hello

}
package other

var X string = "hi"

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

func Add(x, y int) int {
      return x + y
}

然后在 hello.go 中这样调用它:

x := math.Add(6, 5)

将它们保持小写确实有其目的,特别是如果你想保护它免于在包外无意中使用。