zoukankan      html  css  js  c++  java
  • 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)
    }
    

    七.结构体类型断言

    写法一:

    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)
    }
    
    
  • 相关阅读:
    Sherlock and Squares
    [leetcode] Super Ugly Number
    [leetcode] Ugly Number II
    [leetcode] Ugly Number
    [leetcode] Burst Balloons
    菜根谭#268
    菜根谭#267
    菜根谭#266
    菜根谭#265
    菜根谭#264
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11907713.html
Copyright © 2011-2022 走看看