我对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
如何解决?谢谢你!
答案 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"