【筆記】go語言--結構體,方法,包與封裝
阿新 • • 發佈:2022-02-07
【筆記】go語言--結構體,方法,包與封裝
結構體和方法
面向物件
- go語言僅支援封裝,不支援繼承和多型
- go語言沒有class,只有struct
//結構的定義 type TreeNode struct { Left,Right *TreeNode Value int } //結構體的建立 root := TreeNode{Value: 3} root.Left = &TreeNode{} root.Right = &TreeNode{nil, nil,5} root.Right.Left = new(TreeNode) 需要注意,不論地址還是結構本身,一律使用.來訪問成員 //此為自定義工廠函式,接結構體的建立,go語言可實現返回區域性變數 func createTreeNode(value int) *TreeNode { return &TreeNode{Value: value} } root.Left.Right = createTreeNode(2) 使用自定義工廠函式,同時注意返回了局部變數的地址!
既然知道能夠返回區域性變數的地址,那麼結構建立在堆上還是棧上了呢?
看情況,有go語言的編譯器和執行環境來決定,如果這個區域性變數讓編譯器認為沒有取地址並且返回出去,認為這個區域性變數不需要給外面使用,那麼就會在棧上分配
但是,如果編譯器認為這個區域性變數通過取地址並且返回出去給別人用,那麼這個區域性變數就會在會在堆上分配,堆上分配完後,這個區域性變數就會參與垃圾回收,等外部呼叫這個指標使用完後,這個指標就會被回收。
為結構體定義方法
//呼叫結構體,值接受者與指標接受者 //為結構體定義方法,顯示定義和命名方法接受者 func (node treeNode) print() { fmt.Print(node.value) } //使用指標作為方法接受者,只有使用指標才可以改變結構內容,同時nil指標也可以呼叫方法 func (node *treeNode) setValue(value int) { node.value = value } func createNode(value int) *treeNode { return &treeNode{value: value} } func main() { var root treeNode root = treeNode{value: 3} root.left = &treeNode{} root.right = &treeNode{5, nil, nil} root.right.left = new(treeNode) root.left.right = createNode(2) root.right.left.setValue(4) root.right.left.print() }
//中序遍歷
func ( node *treeNode) traverse() {
if node == nil {
return
}
node.left.traverse( )
node.print( )
node.right.traverse( )
}
值接收者vs指標接收者
- 要改變內容必須使用指標接收者
- 結構過大也考慮使用指標接收者
- —致性:如有指標接收者,最好都是指標接收者
- 值接收者是go語言特有的
- 值/指標接收者均可接收值/指標
包和封裝
封裝
- 名字一般使用CamelCase
- 首字母大寫:public,代表全域性可見,即公有方法
- 首字母小寫:private,代表包內可見,即私有方法
包
- 每個目錄一個包,包名可以和目錄名不同名,但是建議同名
- main包中包含可執行入口
- 為結構定義的方法必須放在同一個包內
- 可以是不同的檔案