结构体

结构体等价关系,只有==和!=关系,没有> < 关系,只有字段和属性完全相同,才等价,并且属于同一类型结构体,不同结构体不能比较,每一个不同的指针结构体的地址均不同

type UserInfo struct {Name stringAge intHeight float32EduSchool stringHobby []stringMoreInfo map[string]interface{}
}
//工厂模式:生成对象
func NewUserInfo(name string,age int,height float32,eduSchool string,hobby []string,moreInfo map[string]interface{}) *UserInfo  {return &UserInfo{name,age,height,eduSchool,hobby,moreInfo,}}

结构体+方法

//定义结构体
type miniaction struct {name stringrouter stringaction string
}func (mini miniaction) getMiniInfo()  {fmt.Printf("mini.name=%s,router=%s,mini.action=%s\n",mini.name,mini.router,mini.action)
}
func (this *miniaction)miniInfo()  {fmt.Println(this.name,this.action,this.router)
}
func (this *miniaction)getName() string  {return this.name
}
func (this *miniaction)setName(name string)  {this.name = name
}

结构体赋值

 type integer intvar intVar integervar intVar2 intfmt.Println(intVar,intVar2)type userInfo struct {Name stringAge inthobby []stringmoreInfo map[string]interface{}}huge := userInfo{Name: "奇衡三",Age: 18,hobby: []string{"电影","唱歌"},moreInfo: map[string]interface{}{"role":"演员","earnMoney":300000,},}fmt.Println(huge)var xiaoming *userInfoxiaoming = new(userInfo)(*xiaoming).Name= "xiaoming"(*xiaoming).Age = 18fmt.Println(xiaoming)var xiaohong *userInfo = &userInfo{"小红",12,[]string{"学习","完"}, map[string]interface{}{"年仅":"五年级"},}fmt.Println(xiaohong,(*xiaohong))mini1 := miniaction{name: "获取商品列表",router: "productionList",action: "productionList()",}mini1.getMiniInfo()

结构体标签
Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。
结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔。 注意事项: 为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。

type Skill struct {Name string `json:"code,omitempty"`//标签 omitempty过滤空值level int
}
type Actor struct {Name string `json:"name"`//标签Age intSkill []Skill
}
func main()  {//[6]Skill{.....}数组结构体//[]Skill{....}结构体切片qihengsan := &Actor{Name: "齐恒三",Age: 18,Skill: []Skill{{Name: "JAVA",level: 1},{Name: "JAVASCRIPT",level: 1},{Name: "GO",level: 0},}}res, err := json.Marshal(qihengsan)if err != nil {fmt.Println("失败")return}fmt.Println(string(res))
}
//Student 学生
type Student struct {ID int `json:"id"` //通过指定tag实现json序列化该字段时的keyGender string //json序列化是默认使用字段名作为keyname string //私有不能被json包访问
}

注意点

  1. 结构体是值类型
  2. 结构体之间是否可以相互转换?可以转换,前提条件:具有相同的字段(个数,类型,名称)
  3. 结构体可以做为另一个结构体字段的类型
  4. 结构体变量赋值,各字段不在同一行时,最后一个字段必须加逗号
  5. 结构体变量赋值,各字段在同一行时,最后一个字段的逗号可加,可不加
    方法的接收者类型
  6. 值类型,改变的是接收的副本,不改变接收者本身
  7. 指针类型,传递地址,可直接改变
    结构体继承
type Animal struct {name string
}func (animal *Animal) move()  {fmt.Println(animal.name ,"会动")
}type Dog struct {*Animalclever int
}func (dog *Dog)wang()  {fmt.Println(dog.name,"汪汪")
}
func main()  {d1 := &Dog{clever: 100,Animal:&Animal{name: "张三",}}d1.move()d1.wang()}

JSON

package mainimport ("encoding/json""fmt"
)type Student struct {ID intGender stringName string
}
type Class struct {Title stringStudent []*Student}
func main()  {//序列化class := &Class{Title: "计算机班",Student: make([]*Student,0,200),}for i := 0; i < 20; i++ {stu := &Student{Name: fmt.Sprintf("stu%d",i),Gender: "男",ID: i}class.Student = append(class.Student, stu)}data,err := json.Marshal(class)if err != nil {fmt.Println("错误")return}fmt.Printf("%s",data)//解码jsonstr := `{"Title":"计算机班","Student":[{"ID":0,"Gender":"男","Name":"stu0"},{"ID":1,"Gender":"男","Name":"stu1"},{"ID":2,"Gender":"男","Name":"stu2"},{"ID":3,"Gender":"男","Name":"stu3"},{"ID":4,"Gender":"男","Name":"stu4"},{"ID":5,"Gender":"男","Name":"stu5"},{"ID":6,"Gender":"男","Name":"stu6"},{"ID":7,"Gender":"男","Name":"stu7"},{"ID":8,"Gender":"男","Name":"stu8"},{"ID":9,"Gender":"男","Name":"stu9"},{"ID":10,"Gender":"男","Name":"stu10"},{"ID":11,"Gender":"男","Name":"stu11"},{"ID":12,"Gender":"男","Name":"stu12"},{"ID":13,"Gender":"男","Name":"stu13"},{"ID":14,"Gender":"男","Name":"stu14"},{"ID":15,"Gender":"男","Name":"stu15"},{"ID":16,"Gender":"男","Name":"stu16"},{"ID":17,"Gender":"男","Name":"stu17"},{"ID":18,"Gender":"男","Name":"stu18"},{"ID":19,"Gender":"男","Name":"stu19"}]}`class := &Class{}err := json.Unmarshal([]byte(jsonstr), class)if err != nil {fmt.Println("转换失败")return}fmt.Println(*class)fmt.Println(*class.Student[0])
}

面试题

package main
import "fmt"
type student struct {id intname stringage int
}
func demo(ce []student) {//切片是引用传递,是可以改变值的ce[1].age = 999// ce = append(ce, student{3, "xiaowang", 56})// return ce
}
func main() {var ce []student //定义一个切片类型的结构体ce = []student{student{1, "xiaoming", 22},student{2, "xiaozhang", 33},}fmt.Println(ce)demo(ce)fmt.Println(ce)//[{1 xiaoming 22} {2 xiaozhang 33}]//[{1 xiaoming 22} {2 xiaozhang 999}]
}
//实现map的有序输出mapha := make(map[int]string,5)mapha[1] = "aaaaaaaaa"mapha[2] = "bbbbbbbbb"mapha[3] = "ccccccccc"mapha[4] = "ddddddddd"mapha[5] = "eeeeeeeee"for k,v := range mapha{//map是无序的,默认无序输出fmt.Println(k,v)}slice1 := []int{}for k,_ := range mapha{slice1 = append(slice1,k)}sort.Ints(slice1)for i := 0; i < len(mapha); i++ {fmt.Println(mapha[slice1[i]])}

匿名结构体

// 定义手机屏幕
type Screen struct {Size float32 // 屏幕尺寸ResX, ResY int // 屏幕水平和垂直分辨率
}
// 定义电池
type Battery struct {Capacity int // 容量
}
// 生成json数据
func genJsonData() []byte {// 完整数据结构raw := &struct {ScreenBatteryHasTouchID bool // 序列化时添加的字段:是否有指纹识别}{// 屏幕参数Screen: Screen{Size: 5.5,ResX: 1920,ResY: 1080,},//电池参数Battery: Battery{2910,},//// 是否有指纹识别HasTouchID: true,}// 将数据序列化为jsonjsonData, _ := json.Marshal(raw)return jsonData
}func main() {// 生成一段json数据jsonData := genJsonData()fmt.Println(string(jsonData))// 只需要屏幕和指纹识别信息的结构和实例screenAndTouch := struct {ScreenHasTouchID bool}{}// 反序列化到screenAndTouchjson.Unmarshal(jsonData, &screenAndTouch)// 输出screenAndTouch的详细结构fmt.Printf("%+v\n", screenAndTouch)// 只需要电池和指纹识别信息的结构和实例batteryAndTouch := struct {BatteryHasTouchID bool}{}// 反序列化到batteryAndTouchjson.Unmarshal(jsonData, &batteryAndTouch)// 输出screenAndTouch的详细结构fmt.Printf("%+v\n", batteryAndTouch)
}

golang学习笔记(结构体+json)相关推荐

  1. Go语言学习笔记——结构体中使用tag标记

    文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...

  2. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  3. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  4. golang入门笔记—结构体

    //type后面跟的是类型 type myInt int //自定义类型,%T输出为main.myInt type yourInt=int//类型别名,只是在代码编写过程中起作用 var n myIn ...

  5. C语言学习笔记---结构体中的字符数组和字符指针

      在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串.比如: struct str{char s1[5];char s2[5];};struct str str1= {" ...

  6. C语言学习笔记---结构体作为函数参数和返回值

      结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...

  7. C语言学习笔记---结构体指针

      既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体.下面通过一个简单的例子来演示一下: struct Date{int year;int month;int ...

  8. C语言学习笔记---结构体数组初始化

      既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...

  9. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

最新文章

  1. JAVA-OPTS引发的思考
  2. WDSL文件中的XML元素
  3. 事件标志组的原理与创建
  4. 从netty-example分析Netty组件
  5. Windows10,Maven配置 电脑重启失效
  6. 命令行下 pdb 调试 Python 程序
  7. Mysql 启动报错解析:Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/dat
  8. IOT(11)---浙江移动物联网应用开放平台
  9. BZOJ_1606_ [Usaco2008_Dec]_Hay_For_Sale _购买干草_(背包)
  10. Android BLE新手进入
  11. 我开发的kvm虚拟化虚拟机批量生产脚本
  12. 讨论CGContextDrawImage
  13. 千万数据,如何快速商品分页
  14. 仿短视频竖屏播放美nv源码 源码仅供技术参考
  15. 资源分享 | 敬伟 PS 教程 ABCD 四套全集
  16. 软件测试-xx银行面试经验过程详细版
  17. IMDG中的陷阱和问题
  18. excel 锁定第一行
  19. pytorch GradScale 梯度缩放算子
  20. HTML基础知识整理

热门文章

  1. 猎头职场:这些员工要自我调整了
  2. 汽车标定知识整理(二):CCP报文基本命令介绍
  3. php json decode 数组,php使用json_decode将json转换为数组
  4. 【2021年1月新书推荐】TensorFlow 2.x in the Colaboratory Cloud
  5. matlab期末试卷,matlab期末考试试卷及参考答案
  6. 编码:隐匿在计算机背后的语言(1-3章)
  7. java实现图片验证码全套实现方式
  8. 销售技巧:以色列教育孩子的方式
  9. sybase-ase1252_de_linux install on as4u5
  10. Arch KDE Plasma 显示和字体调整