Golang 之 面向物件struct (一)
阿新 • • 發佈:2019-01-26
golang語言僅支援封裝,不支援繼承和多型,繼承和多型要做的事,可以用面向介面來做,只有struct沒有class
package main
import "fmt"
type treeNode struct {
value int
left, right * treeNode
}
func createNode(val int) *treeNode {
// golang 可以 返回區域性變數的地址給外面用
// 在該函式中,區域性變數分配在棧上,退出該函式,區域性變數將被銷燬
// 如果要傳出去,我們必須在堆上分配,堆上分配在C++中我們要手動釋放,
// java 中new出的物件都是分配在堆上,所以才會有垃圾回收機制
// 在golang中不需要知道,如果treeNode沒有如下取地址返回出去,編譯器很可能就認為
// 該變數需要分配在棧上,如果取地址返回出去給別人用了,他就會去堆上分配,並且參與垃圾回收機制
return &treeNode{ value: val}
}
func main() {
var root treeNode
// 初始化的變數都會被初始化為該型別的零值,例如bool型別的零值為false, int型別的零值為0, string型別的零值為空字串
fmt.Println(root)
// 構造一個簡單的樹
root = treeNode{ value:3}
root.left = &treeNode{ }
root.right = &treeNode{ 5,nil,nil }
// 用 new 分配記憶體 內建函式 new 本質上說跟其他語言中的同名函式功能一樣:new(T) 分配了零值填充的 T 型別的記憶體空間,
//並且返回其地址,那麼一個 *T 型別的值。用 Go 的術語說,它返回了一個指標,指向新分配的型別 T 的零值。記住這點非常重要。
//這意味著使用者可以用 new 建立一個數據結構的例項並且可以直接工作
root.right.left = new (treeNode)
// 對結構體指標使用`.` - 指標會被自動解引用。
root.right.right = createNode(2)
// 切片中定義
nodes := []treeNode {
{value: 3},
{value: 4},
{5,nil,&root},
}
fmt.Println(nodes)
}