包的概念在很多编程语言都有,Go语言中包的概念还是挺有意思的.
按照上述定义,我讲自己写的结构体与main分割开,使用不同的包,但发现竟然自定义结构却一直不能导包.
从编译器提示发现,自己写的tree.Node 后没有提示包名,而Go自带parse.Tree类后却有提示包名.所以猜测应该是Go环境问题.
GOROOT是GO的安装目录,就像Java安装完jdk后,需要配置环境变量才可以直接在命令行中输入java -version
有信息返回.
GO也一样,首先配置GO的环境变量也是为了方便我们在命名行中输入GO的命令.
GOPATH是GO的工作目录,也叫工作空间,使用命令行go env GOPATH
查看本机.GOPATH中可以编写我们自己写的程序,且在程序运行时,编译器会将其目录下的src下的所有GO文件加载到go运行虚拟机中.
--bin 通过src下go文件编译后
--src 自己写的go程序,获取网络上拉取得go资源.(且只有在src下的文件才可以供其它,go文件导入)
--pkg 编译过程中生成得过度文件
程序运行,如果有导包情况,虚拟机会先去GOROOT下的src查找,如果没有找到,再去GOPATH下查找.
这是因为GO1.8以后,如果GOPATH为空的话,GO会默认设置:win:C:/Users/{用户名}/go
,Linux:$HOME/go
而我们自己写的程序并没有放在这些目录下,还是运行成功,是因为自己写的程序没有跨包调用,且每个程序都导入了main包,这个包是GOROOT下所以肯定可以找得到,main包有一个可执行入口,所以我们程序在main方法下运行完好.
根据我们对GOPATH的解密,解决GO文件中不能导入自己写的结构体包的解决方法就很简单了.
具体设置:
步骤1:
步骤2:
在原有的目录下创建src文件夹,原来所有GO文件包括目录放入src下
根据上面规则修改完后得代码:
package tree
import "fmt"
type Node struct {
Value int
Left, Right *Node //指针
}
/**
工厂方法,控制创建
*/
func CreateNode(value int) *Node {
return &Node{Value: value}
}
func (node Node) Print() {
fmt.Print(node.Value, " ")
}
func (node *Node) SetValue(value int) {
if node == nil {
fmt.Println("nil调用了函数setValue")
return
}
node.Value = value
}
func (node *Node) Traverse() {
if node == nil {
return
}
node.Left.Traverse()
node.Print()
node.Right.Traverse()
}
package main
import (
"fmt"
"tree"
)
func main() {
//创建 和 调用
var root tree.Node //首字母大写才能被其他包调用
root = tree.Node{Value: 5}
root.Left = &tree.Node{Value: 1}
root.Right = &tree.Node{Value: 2}
root.Left.Right= &tree.Node{Value: 3}
root.Right.Left = &tree.Node{Value: 4}
root.Traverse()
}
作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star?