• 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() //狗的动作
    }
    

      

      

  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    线性表——数组实现
    this指针与const成员函数
    类对象拷贝是不是赋值操作??
    你真的理解内联函数吗?
    名字查找先于类型检查:函数重载与作用域
    谈谈函数调用
    推荐形参使用常量引用:void func(const T &);
  • 原文地址:https://www.cnblogs.com/finnlee/p/14109832.html
Copyright © 2020-2023  润新知