golang 导入自定义包_golang学习笔记八--Go自定义结构不能导入包?(GOPATH解密)-Go语言中文社区...

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

一个目录下只有一个包

包的命名与目录可以不同(这点与Java不同)

main包下有一个可执行入口,所以main方法只能在main包下执行

go语言不以文件为基本单元,而是包为基本单元,一个结构体可以是不同文件的组合但必须在同一包下

封装

采用camelCase命名规则

大写为public

小写为private

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

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

5561a6cee8ec23fb4a5ea3afda765e4a.png

从编译器提示发现,自己写的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:

a1b84bf8b86b4c2e55f1b575e45cff34.png

步骤2:

在原有的目录下创建src文件夹,原来所有GO文件包括目录放入src下

fff2e1a247f8926a291d13c9acfe16b7.png

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值