golang学习笔记八--Go自定义结构不能导入包?(GOPATH解密)

包的概念在很多编程语言都有,Go语言中包的概念还是挺有意思的.

  • 一个目录下只有一个包
  • 包的命名与目录可以不同(这点与Java不同)
  • main包下有一个可执行入口,所以main方法只能在main包下执行
  • go语言不以文件为基本单元,而是包为基本单元,一个结构体可以是不同文件的组合但必须在同一包下

封装

  • 采用camelCase命名规则
  • 大写为public
  • 小写为private

不能导入自定义结构的包?

按照上述定义,我讲自己写的结构体与main分割开,使用不同的包,但发现竟然自定义结构却一直不能导包.

golang学习笔记八--Go自定义结构不能导入包?(GOPATH解密)_第1张图片

从编译器提示发现,自己写的tree.Node 后没有提示包名,而Go自带parse.Tree类后却有提示包名.所以猜测应该是Go环境问题.

GOPATH解密

  • GOROOT与GOPATH有什么关系

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 编译过程中生成得过度文件
  • GO程序运行步骤

程序运行,如果有导包情况,虚拟机会先去GOROOT下的src查找,如果没有找到,再去GOPATH下查找.

疑问为什么我们之前没有配置GOPATH却也可以运行?

这是因为GO1.8以后,如果GOPATH为空的话,GO会默认设置:win:C:/Users/{用户名}/go,Linux:$HOME/go

而我们自己写的程序并没有放在这些目录下,还是运行成功,是因为自己写的程序没有跨包调用,且每个程序都导入了main包,这个包是GOROOT下所以肯定可以找得到,main包有一个可执行入口,所以我们程序在main方法下运行完好.

小结

根据我们对GOPATH的解密,解决GO文件中不能导入自己写的结构体包的解决方法就很简单了.

具体设置:

步骤1:

golang学习笔记八--Go自定义结构不能导入包?(GOPATH解密)_第2张图片

步骤2:

在原有的目录下创建src文件夹,原来所有GO文件包括目录放入src下
golang学习笔记八--Go自定义结构不能导入包?(GOPATH解密)_第3张图片

根据上面规则修改完后得代码:

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?

你可能感兴趣的:(Go语言学习)