一.结构体有名属性
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)
}