1. 程式人生 > 其它 >【筆記】go語言--結構體,方法,包與封裝

【筆記】go語言--結構體,方法,包與封裝

【筆記】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包中包含可執行入口
  • 為結構定義的方法必須放在同一個包內
  • 可以是不同的檔案
您能讀到這兒,我呢是發自真心的感謝您,若要轉載,還望請您帶上鍊接