【Golang 基礎(chǔ)】Go 語(yǔ)言 面向?qū)ο?/h2>

Go 語(yǔ)言的面向?qū)ο?/h2>

??Go 語(yǔ)言的面向?qū)ο蠓浅:?jiǎn)單,僅支持封裝,不支持繼承和多態(tài)。繼承和多態(tài)是在接口中實(shí)現(xiàn)的。

??因此 Go 語(yǔ)言中沒(méi)有 class,而是通過(guò) struct(結(jié)構(gòu)體) 對(duì)相同類型或不同類型的數(shù)據(jù)進(jìn)行封裝。

  • 通過(guò) type <structName> struct {} 格式定義結(jié)構(gòu)體;
type User struct {
    Name     string
    Age      int
    IsActive bool
}
  • 定義后的結(jié)構(gòu)體就可以作為類型使用;
hvkcoder := User{Name: "hvkcoder", Age: 18, IsActive: true}
fmt.Println(hvkcoder) // {hvkcoder 18 true}

hvkcoder := User{"hvkcoder", 18, true}
fmt.Println(hvkcoder) // {hvkcoder 18 true}
  • 通過(guò) 結(jié)構(gòu)體.成員名稱 訪問(wèn)結(jié)構(gòu)體中的對(duì)象;
fmt.Println(hvkcoder.Name) // hvkcoder
  • 結(jié)構(gòu)體是值類型,因此支持比較運(yùn)算符的使用;
hvkcoder := User{Name: "hvkcoder", Age: 18, IsActive: true}
jason := User{Name: "jason", Age: 20, IsActive: true}
    
fmt.Println(hvkcoder == jason) // false
  • 由于結(jié)構(gòu)體是值類型,因此需要向函數(shù)傳遞 結(jié)構(gòu)體指針,才能去改變結(jié)構(gòu)體中的值;
package main

import "fmt"

type User struct {
    Name     string
    Age      int
    IsActive bool
}

func setName(user *User,name string){
    user.Name = name
}

func main(){
    test := User{Name: "jason", Age: 18, IsActive: true}
    fmt.Println(test.Name) // jason
    setName(&test, "hvkcoder")
    fmt.Println(test.Name) // hvkcoder
}
  • 結(jié)構(gòu)體也可以嵌套
package main

import "fmt"

type Address struct {
    city, town string
}

type User struct {
    Name     string
    Age      int
    IsActive bool
    UAddress Address
}

func main() {
    user := User{
        Name:     "hvkcoder",
        Age:      18,
        IsActive: false,
        UAddress: Address{"北京", "海淀"},
    }

    fmt.Println(user) // {hvkcoder 18 false {北京 海淀}}
}

Go 語(yǔ)言中的方法

??Go 語(yǔ)言中的方法從某種意義上來(lái)說(shuō)就是函數(shù)的語(yǔ)法糖,receiver 作為方法的第一個(gè)強(qiáng)制類型參數(shù)傳入,這也就是 Method ValueMethod Expression 的區(qū)別。

package main

import "fmt"

type Student struct {
    Name string
}

// receiver 定義結(jié)構(gòu)方法
func (student Student) SayHi(){
    fmt.Println("Hello! My name's", student.Name)
}

func main(){

    student := Student{"hvkcoder"}

    // 使用 Method Value 方式調(diào)用方法
    student.SayHi() // Hello! My name's hvkcoder
    
    // 使用 Method Expression 方法調(diào)用方法
    (Student).SayHi(student) // Hello! My name's hvkcoder
}
  • 既然說(shuō)了 Go 語(yǔ)言中的方法實(shí)際上就是函數(shù)的語(yǔ)法糖,因此想通過(guò)方法去改變結(jié)構(gòu)體的值,仍然需要傳遞指針;
package main

import "fmt"

type User struct {
    Name     string
    Age      int
    IsActive bool
}

func (user *User) setName(name string){
    user.Name = name
}

func main(){
    test := User{Name: "jason", Age: 18, IsActive: true}
    fmt.Println(test.Name) // jason
    
    test.setName("hvkcoder")
    fmt.Println(test.Name) // hvkcoder
}
  • Go 中不存在方法重載;
  • 如果外部結(jié)構(gòu)和內(nèi)嵌結(jié)構(gòu)存在同名方法,則優(yōu)先調(diào)用外部結(jié)構(gòu)的方法;

使用 Go 實(shí)現(xiàn)一個(gè)二叉排序樹(shù)

package algorithm

import "fmt"

// 二叉樹(shù)節(jié)點(diǎn)結(jié)構(gòu)
type Node struct {
    Value       int
    Left, Right *Node
}

// 添加二叉排序樹(shù)節(jié)點(diǎn)
func (node *Node) Insert(newNode *Node) {

    // 根據(jù)二叉排序樹(shù)的特點(diǎn),左子樹(shù)的所有節(jié)點(diǎn)均小于根節(jié)點(diǎn),右子樹(shù)的所有節(jié)點(diǎn)均大于根節(jié)點(diǎn)
    if node.Value > newNode.Value {
        // 判斷左子樹(shù)是否有值
        if node.Left == nil {
            node.Left = newNode
        } else {
            node.Left.Insert(newNode)
        }
    } else {
        // 判斷右子樹(shù)是否有值
        if node.Right == nil {
            node.Right = newNode
        } else {
            node.Right.Insert(newNode)
        }
    }
}

// 前序遍歷二叉排序樹(shù)節(jié)點(diǎn)
func (node *Node) PreorderTraversal(){
    if node != nil{
        fmt.Printf("%d ", node.Value)
        node.Left.PreorderTraversal()
        node.Right.PreorderTraversal()
    }
}

// 中序遍歷二叉排序樹(shù)節(jié)點(diǎn)
func (node *Node) InorderTraversal(){
    if node != nil{
        node.Left.InorderTraversal()
        fmt.Printf("%d ", node.Value)
        node.Right.InorderTraversal()
    }
}

// 后序遍歷二叉排序樹(shù)節(jié)點(diǎn)
func (node *Node) PostorderTraversal(){
    if node != nil{
        node.Left.PostorderTraversal()
        node.Right.PostorderTraversal()
        fmt.Printf("%d ", node.Value)
    }
}


// 創(chuàng)建二叉排序樹(shù)
func NewBinarySortTree(treeNode []int) *Node{
    var root *Node
    if len(treeNode) > 0 {
        for _,value := range treeNode {
            node := Node{Value:value}
            if root == nil {
                root = &node
            }else {
                root.Insert(&node)
            }
        }
    }
    return root
}
package main

import (
    "./algorithm"
    "fmt"
)

func main() {
    // 聲明一個(gè)二叉樹(shù)節(jié)點(diǎn) Slice
    treeNode := []int{8, 3, 10, 1, 4, 13, 16, 14}
    // 創(chuàng)建二叉排序樹(shù)
    binarySortTree := algorithm.NewBinarySortTree(treeNode)
    // 使用 前序方式遍歷 二叉樹(shù)
    binarySortTree.PreorderTraversal() // 8 3 1 4 10 13 16 14
    fmt.Println()

    // 使用 中序方式遍歷 二叉樹(shù)
    binarySortTree.InorderTraversal() // 1 3 4 8 10 13 14 16
    fmt.Println()

    // 使用 后序方式遍歷 二叉樹(shù)
    binarySortTree.PostorderTraversal() // 1 4 3 14 16 13 10 8
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容