Golang學習筆記(3)面向“對象”

第三章 面向“對象”


面向對象

  • go語言僅支持封裝, 不支持繼承和多態
  • go語言沒有class,只有struct

結構的創建

type treeNode struct {
	value int
	left, right *treeNode
}

func createTreeNode(value int) *TreeNode {
	return &TreeNode{ value : value }
}

root := TreeNode{ value : 3 }
root.left = &TreeNode{}
root.right = &TreeNode{ 5, nil, nil }
root.right.left = new( TreeNode )
//
root.left.right = createTreeNode( 2 )
  • 一律使用 “.” 訪問成員
  • 使用自定義工廠函數( createTreeNode )
  • 可以返回局部變量的地址

爲結構定義方法

  • 顯示定義和命名方法接收者
func (node TreeNode) print() {
	fmt.Print( node.value )
}
  • 使用指針作爲方法的接收者
    只有指針纔可以改變Struct內容
func (node *TreeNode) setValue(value int) {
	node.value = value
}
  • nil指針也可以調用方法
var root *TreeNode
// 這裏不會報錯, 但是在setValue函數裏 node.value = value 的時候就會報錯了
root.setValue(100)

外部調用函數的時候, 不用在意對象是否爲nil, 但是函數實現內部一定要注意

值接收者 vs 指針接收者

  • 要改變內容必須使用指針接收者
  • 結構過大也考慮使用指針接收者
  • 一致性 : 如有指針接收者, 最好都是指針接收者
  • 值接收者是go語言特有
  • 值/指針接收者均可接收值/指針

封裝

  • Public方法首字母大寫
  • Private方法首字母小寫

  • 每個目錄一個包
  • main包包含可執行入口
  • 爲結構定義的方法必須放在同一個包內, 但是可以是不同的文件
1. 如何擴充系統類型或者別人的類型
  • 定義別名
type Queue []int

func (q *Queue) Push(v int) {
	*q = append(*q, v)
}

func (q *Queue) Pop() int {
	head := (*q)[0]
	*q = (*q)[1:]
	return head
}

func (q *Queue) IsEmpty() bool {
	return len(*q) == 0
}
  • 使用組合
type myTreeNode struct {
	node *tree.TreeNode
}

GOPATH環境變量

  • 默認在~/go(linux), %USERPROFILE%\go(windows)
  • 官方推薦:所有項目和第三方庫都放在同一個GOPATH下

1. go get獲取第三方庫

  • go get命令
  • 使用gopm來獲取無法下載的包
go get -v github.com/gpmgo/gopm

2. go build 來編譯

3. go install 產生pkg文件和可執行文件

4. go run直接編譯運行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章