版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kongshuai19900505/article/details/89739230
1.说明
1)go中虽然没有class,但依旧又method
2)通过显示说明receiver来实现与某个类型的组合
3)只能为同一个包中的类型定义方法
4)receiver可以是类型的值或者指针
5)不存在方法重载
6)可以使用值或指针来调用方法,编译器会自动完成转换
7)从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接受的第一个参数
8)如果外部结构和嵌入式结构存在同名方法,则优先调用外部结构的方法
9)类型别名不会拥有底层类型所附带的方法
10)方法可以调用结构体中的非公开字段
2.封装
1)名字一般使用CamelCase
2)首字母大写:public
3)首字母小写:private
4)上述public和private都是针对于包来说的
3.包
1)每个目录一个包
2)main包包含可执行入口
3)为结构定义的方法必须放在同一个包内
4)可以是不同文件
实例:
代码目录my-code/test-code/创建目录tree,在tree里面创建2个目录,一个是tree另一个是main,每个里面一个文件分别是tree/tree.go,main/main.go
tree.go代码如下
package tree
import "fmt"
type Node struct {
Value int
Left, Right *Node
}
func (node Node) Print() {
fmt.Printf("%d ", node.Value)
}
//go语言结构中没有构造函数,但是可以创建一个工厂函数来负责创建结构
func CreateNode(value int) *Node {
//go语言中返回一个局部变量的地址是可以给外部使用的
return &Node{Value: value}
}
//中序遍历
func (node *Node) Traverse() {
if node == nil {
return
}
node.Left.Traverse()
node.Print()
node.Right.Traverse()
}
main.go代码如下:
package main
import "my-code/test-code/tree/tree"
func main() {
var root tree.Node
root = tree.Node{Value: 3}
root.Left = &tree.Node{}
root.Right = &tree.Node{5, nil, nil}
root.Right.Left = new(tree.Node)
root.Left.Right = tree.CreateNode(2)
//遍历树
root.Traverse()
}
运行输出:
API server listening at: 127.0.0.1:45880
0 2 3 0 5
4.扩展类型
如何扩充系统类型或者别人的类型
1)定义别名
2)使用组合
例如,上述只实现了中序遍历,如果想用到后续或者前序遍历则需要自己扩充实现,那么如何来做呢?通过组合方式实现如下实例(mian.go):
package main
import (
"fmt"
"my-code/test-code/tree/tree"
)
//想要实现tree.Node的后续遍历,那么创建一个结构就可以实现了
type myTreeNode struct {
node *tree.Node
}
func (myNode *myTreeNode) postOrder() {
if myNode == nil || myNode.node == nil {
return
}
left := myTreeNode{myNode.node.Left}
right := myTreeNode{myNode.node.Right}
left.postOrder()
right.postOrder()
myNode.node.Print()
}
func main() {
var root tree.Node
root = tree.Node{Value: 3}
root.Left = &tree.Node{}
root.Right = &tree.Node{5, nil, nil}
root.Right.Left = new(tree.Node)
root.Left.Right = tree.CreateNode(2)
//中序遍历树
root.Traverse()
fmt.Println()
//后续遍历树
myRoot := myTreeNode{&root}
myRoot.postOrder()
}
输出:
API server listening at: 127.0.0.1:22536
0 2 3 0 5
2 0 0 5 3