GO-結構體(相似python中的類)

一.結構體有名屬性

package main
import "fmt"
func main(){
    type Sb struct {
        name string  //屬性名,數據類型
        age int    //若是兩個屬性數據類型同樣能夠name,age int
    }
    //他有兩個屬性不必定要兩個屬性都進行賦值
    //位置進行傳參{"you",11}
    //可是位置傳參必須全部屬性都傳進去
    sb1 :=Sb{name:"you",age:11}  //屬性名:屬性值
    
     
    fmt.Println(sb1)  //{you 11}
    fmt.Println(sb1.name) //you
}

二.結構體匿名屬性

package main
import "fmt"
func main(){
    type Sb struct {
         string  //數據類型
         int
    }
    sb1 :=Sb{string:"you"}
    fmt.Println(sb1)  //{you 0}
    fmt.Println(sb1.string) //you
}

三.結構體方法

package main
import "fmt"

type Sb struct {
}

//注意點不定義在main函數內
func (sb Sb) Speak() {   //func (結構體對象 結構體類型) 方法名(){}
    fmt.Println("嗯")
}


func main(){
    wq :=Sb{}
    wq.Speak()
}

四.結構體嵌套

type Hobby struct {
    name string
    id int
}
type Person struct {
    name  string
    Hobby   //結構體名稱
}
func main(){
    a := Person{name: "p1",Hobby:Hobby{name:"LOL",id:1}}
    
    fmt.Println(a.Hobby.name) //若是名字有重名須要.結構體.屬性
    
    fmt.Println(a.id)//若是沒有重名屬性名會提高
    //fmt.Println(a.Hobby.id)你一樣也能夠這樣獲取
}

/*
我的理解能夠把它理解成python中的類的繼承,好比A繼承B
type B struct {int}
type A struct {B}
可是也有不一樣之處,他兩個類中的名字同樣能夠共存,而python中不行
*/

五.結構體爲方法的參數且修改結構體的屬性

package main
import "fmt"

type Person struct {
    name  string
}

func ChangeName(p *Person,NewName string){   //若是不是改變原來的類只傳值能夠穿結構體對象
    (*p.name) = NewName  //也能夠寫成p.name=NewName
}
func main(){
    a := Person{name: "p1"}
    ChangeName(&a,"ywy")
    fmt.Println(a.name)
}

六.結構體爲方法的參數不修改結構體的屬性

package main
import "fmt"

type Person struct {
    name  string
}

func ChangeName(p Person,NewName string){   
    p.name = NewName  
}
func main(){
    a := Person{name: "p1"}
    ChangeName(a,"ywy")
    fmt.Println(a.name)
}

七.結構體類型斷言

寫法一:python

package main
import "fmt"

type Person struct {
    name  string
}
func Test(a interface{}){
    _,err :=a.(*Person)
    if !err{
        fmt.Println("是Person")
    }
}

func main(){
    a := Person{name: "p1"}
    Test(a)
}

寫法二:函數

package main

import (
    "fmt"
)

type Person struct {
    name string
}

func Test(a interface{}) {
    switch a.(type) {   //若是要獲取a的對象就AStruct :=a.(type)
    case Person:
        fmt.Println("是Person")
    default:
        fmt.Println("不是Person")
    }
}
func main() {
    a := Person{name: "p1"}
    Test(a)
}
相關文章
相關標籤/搜索