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)
    }
    
    
  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11907713.html
Copyright © 2011-2022 走看看