go语言学习(9)--package

幸运草 2020年4月14日23:12:09前端框架评论阅读模式

包管理

我用过的语言,比如java,python都是按包来区分命名空间的
go里也是一样

1import (
2    "golearn/lesson8/tree"
3    "fmt"
4    "golearn/lesson8/queue"
5)

这里fmt就是go里的标准库的包
前面说到过,go里常量不推荐大写,为什么,因为,go里首字母大写代表public
我们来看一下上一章的二叉树,如果要把中序遍历扩展一下成后序遍历,怎么做呢
首先得改造一下,首字母都大写

 1package tree
 2
 3import "fmt"
 4
 5type Node struct {
 6    Value       int
 7    Left, Right *Node
 8}
 9
10func (node Node) Print() {
11    fmt.Println(node.Value)
12}
13
14func CreateNode(value int) *Node {
15    // go 里不需要关心变量是在堆上创建还是栈上创建的
16    return &Node{Value: value}
17}
18
19func (node *Node) SetValue(value int) {
20    node.Value = value
21}
22
23func (node *Node) Traverse() {
24    if node == nil {
25        return
26    }
27    // 其他语言需要判断 null,go 不用
28    node.Left.Traverse()
29    node.Print()
30    node.Right.Traverse()
31}

这是之前的代码,现在把方法名和变量名全都首字母大写

idea 里装上UpperLowerCapitalize插件后
Alt+P // to uppercase
Alt+L // to lowercase
Alt+C // 首字母大写

把 tree.go这个文件移到tree这个文件夹下,因为一个文件夹下只能有一个包名, MyTreeNode是 main包

这里有个小插曲,我本来这个包叫 lesson8(package),发现引入后怎么都是报错,才发现,包名不能带括号

之前的中序遍历是这样的

 1func main() {
 2    var root tree.Node
 3    root = tree.Node{Value: 3}           // root->3
 4    root.Left = &tree.Node{}             // left->0
 5    root.Right = &tree.Node{5, nil, nil} // right->5
 6    root.Right.Left = new(tree.Node)     // right->left->0
 7    root.Left.Right = tree.CreateNode(2) // left->right->2
 8    root.Right.Left.SetValue(4)
 9    // 0->2->3->4->5
10    root.Traverse()
11}

来体验一下go的面向接口编程

 1type MyTreeNode struct {
 2    node *tree.Node
 3}
 4
 5// 后序遍历
 6func (myNode *MyTreeNode) postOrder() {
 7    if myNode == nil || myNode.node == nil {
 8        return
 9    }
10    left := MyTreeNode{myNode.node.Left}
11    right := MyTreeNode{myNode.node.Right}
12    left.postOrder()
13    right.postOrder()
14    myNode.node.Print()
15}

沿用之前的结构体,定义一个新的结构体MyTreeNode
然后给MyTreeNode增加一个方法
func (结构体指针) 方法名([参数])[返回值]
后序遍历就是左右中,如上面的代码
来验证一下

1fmt.Println("后序遍历")
2myRoot := MyTreeNode{&root}
3myRoot.postOrder()
4// 2 0 4 5 3

扩展

我想把之前的数组的 push 和 pop 封装一下
和二叉树一样,单独放在一个包里

 1package queue
 2
 3type Queue []int
 4
 5func (q *Queue) Push(v int) {
 6    *q = append(*q, v)
 7
 8}
 9
10func (q *Queue) Pop() int {
11    head := (*q)[0]
12    *q = (*q)[1:]
13    return head
14}
15
16func (q *Queue) IsEmpty() bool {
17    if len(*q) == 0 {
18        return true
19    } else {
20        return false
21    }
22}
 1package main
 2
 3import (
 4    "golearn/lesson8/tree"
 5    "fmt"
 6    "golearn/lesson8/queue"
 7)
 8
 9func  main(){
10    s := queue.Queue{1, 3, 5, 7, 9}
11    s.Push(11)
12    fmt.Println(s)
13    for !s.IsEmpty() {
14        s.Pop()
15        fmt.Println(s)
16    }
17
18}

总结

  • 要想让其他包能访问你的包,变量和方法首字母大写,代表public

上述代码均已上传至 github, 欢迎 star
https://github.com/yejunyu/golearn


 

特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草
Go语言接口规则 前端框架

Go语言接口规则

Go语言接口规则 接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口对应的全部方法签名。就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。对应方法,是指有相同名称、参数...
Go语言中处理 HTTP 服务器 前端框架

Go语言中处理 HTTP 服务器

1 概述 包 net/http 提供了HTTP服务器端和客户端的实现。本文说明关于服务器端的部分。 快速开始: package main import (   "log"   "net/http" )...

发表评论