Golang导入包

时间:2015-10-04 09:55:24

标签: 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)
}

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

如何解决?谢谢你!

4 个答案:

答案 0 :(得分:9)

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

最简单的解决方法是通过将math.add()功能更改为Add()中的math.go来导出func Add(x, y int) int { return x + y } 功能:

main.go

当然,当你从x := math.Add(6, 5)

中引用它时
hello_world/math

作为附注,请注意,在导入import ( "fmt" "hello_world/math" ) 包时,您不必指定新名称来引用其导出的标识符:默认情况下,它将是其导入路径的最后一部分,所以这相当于你的进口:

private void Song_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
    Song song = (sender as Grid).DataContext as Song;
    // Show PopupMenu
    // ...
}

答案 1 :(得分:2)

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

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

然后在 hello.go 中调用它:

x := math.Add(6, 5)

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

答案 2 :(得分:0)

在主函数中调用Add时,不要使用此

return

改为使用此

public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView (inflater, container, savedInstanceState);
    var view = inflater.Inflate (Resource.Layout.abc_list_menu_item_layout, container, false);
    lst = view.FindViewById<ListView> (Resource.Id.lst_genre);
    lst.SetAdapter(new ArrayAdapter<string> (this.Activity,Resource.Layout.abc_list_menu_item_layout,Resource.Menu.Genres));
    //Event click on listview
    lst.ItemClick+= delegate(object sender, AdapterView.ItemClickEventArgs e) {             
    };
    return view;
}

答案 3 :(得分:0)

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

示例:

package main

import "fmt"
import "other/out"

func main(){

fmt.Println(out.X)

// hello

}
package other

var X string = "hi"