1. 程式人生 > >Golang 之 面向物件struct (一)

Golang 之 面向物件struct (一)

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) }