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