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

  

  

posted @ 2020-12-09 17:23  FinnYY  阅读(110)  评论(0编辑  收藏  举报