GO基础,结构体

结构体

结构体转JSON(结构体转换成JSON 字段必须是公有的)

jsonByte,_ := json.Marshal(s1) //返回一个byte类型数组  s1结构体对象
jsonStr := string(jsonByte) //把byte类型数组转json字符串

JSON转结构体

err := json.Unmarshal([]byte(str),&s2) //把json字符串转成byte类型的切片 并赋值给s1对象 需要修改里面的字段需要加&
fmt.Println(err) //返回值为nil解析成功
fmt.Println(s2) //返回结构体
fmt.Printf("%T",s2) //返回结构体

嵌套结构体转JSON

//学生结构体
type Student struct {
        Id int
        Gender string
        Name string
}

//班级结构体
type Class struct {
        Title string
        Student []Student
}

func main() {
        c := Class{
                Title: "001",
                Student: make([]Student,0),//[]Student{},
        }
        //动态添加student
        for i := 0;i < 10 ; i++ {
                s := Student{
                        Id: i,
                        Gender: "男",
                        Name: fmt.Sprintf("stu_%v",i),
                }
                c.Student = append(c.Student,s)
        }
        jsonByte,_ := json.Marshal(c)
        jsonStr := string(jsonByte)
        fmt.Println(jsonStr)
}

  

定义结构体

type User struct {
//结构体名称和属性 首字母大写表示公有的 首字母小写表示私有的
id int `json:"id"`//结构体标签 tag 用于转json之后key的
nickname string
mobile string
sex string
}
func main(){
//结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 为值类型
var u User //实例化结构体
//var u1 = new(User) //实例化结构体 u1为结构体指针 可以(*u1).id 取值
//var u2 = &User{} //结构体地址给u2 和指针类似
//var u3 = User{id:2,nickname:"李四","mobile":"13966666666","sex":"女",} //k-v结构赋值
//var u4 = &User{id:2,nickname:"李四","mobile":"13966666666","sex":"女",} //k-v结构赋值
u.id = 1
u.nickname = "张三"
u.mobile = "13522223333"
u.sex = "男"
fmt.Println(u)
return

结构体方法

type User struct {
        //结构体名称和属性  首字母大写表示公有的  首字母小写表示私有的
        id int
        nickname string
        mobile string
        sex string
}
//定义结构体方法(个人理解就是这个方法只有这个结构体实例化后能调用)
func (u User) PrintInfo(){
        fmt.Println(u)
}
func (u *User) SetInfo(id int,nickname string){
        u.id = id
        u.nickname = nickname
}
func main(){
        //结构体方法和接收者
        //--没有类的概念但是可以给类型(结构体、自定义类型)定义方法,方法就是定义了者接收的函数 接收者的概念类似于其他语言的this和self
        u := User{
                id:1001,
                nickname: "张三丰",
                mobile: "15899998888",
        }
        u.SetInfo(5,"张无忌") //如果SetInfo不是指针类型 此处不能修改u的值
        u.PrintInfo()
        return 

结构体数据类型

type Person struct {
        Name string
        Sex string
        Hobby []string
        Map1 map[string]string
        Struct1 struct{
                string
                int
        }
}


func main() {
        /*
        结构体的字段类型可以为:基本数据类型、切片、Map以及结构体
        如果结构体的字段类型是:指针、slice和map的零值都为nil ,即还没有分配内存空间
        如果需要使用这样的类型 需要使用make
        */
        p := Person{
                Name: "张学友",
                Sex: "男",
                Hobby: []string{"唱歌","跳舞"},
                Map1: map[string]string{"title":"MAP标题"},
                Struct1: struct {
                        string
                        int
                }{string: "刘德华", int:18 },
        }
        fmt.Println(p)
} 

结构体继承

//定义动物的结构体
type Animal struct {
        Name string
}
//定义动物的结构体方法
func (a Animal) run(){
        fmt.Println("动物跑的方法")
}
//定义狗的结构体
type Dog struct {
        Color string
        Animal //定义
}
//定义狗结构体的方法
func (d Dog) wang(){
        fmt.Println(d.Name+d.Color)

}

func main() {
        //实例化动物结构体
        animalObj := Animal{
                Name: "动物",
        }
        //animalObj.run() //动物的动作

        //实例化狗的结构体
        dogObj := Dog{
                Color: "红色",
                Animal:animalObj, //这个传入结构体
        }
        dogObj.wang() //狗的动作
}