文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go Struct结构体如何实现

2023-07-05 12:39

关注

本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

什么是结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。(继承,多态,封装)

Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。

1. 基本实例化(方法1)

只有当结构体实例化时,才会真正地分配内存(其实也就是使用new),也就是必须实例化后才能使用结构体的字段。

结构体本身也是一种类型,我们可以像声明内置类型一样使用 var 关键字声明结构体类型。

type person struct { name string city string age int } func main() { var p1 person p1.name = "张三" p1.city = "北京" p1.age = 18fmt.Printf("p1=%v\n", p1) // p1={张三 北京 18}fmt.Printf("p1=%#v\n", p1) // p1=main.person{name:"张三", city:"北京", age:18} }

2. new实例化(方法2)

我们还可以通过使用 new 关键字对结构体进行实例化,得到的是结构体的地址

从打印的结果中我们可以看出 p2 是一个结构体指针。

注意:在 Golang 中支持对结构体指针直接使用.来访问结构体的成员。

p2.name = "张三" 其实在底层是 (*p2).name = "张三"

type person struct {name stringcity stringage int} func main() {    var p2 = new(person)    p2.name = "张三"    p2.age = 20    p2.city = "北京"    fmt.Printf("p2=%#v \n", p2) //p2=&main.person{name:"张三", city:"北京", age:20}}

3. 键值对初始化(方法3 结构体能够使用指针就使用指针)

type person struct {name stringcity stringage int} func main() {    p4 := &person{    name: "zhangsan",    city: "北京",    age: 18,    }    // p4=&main.person{name:"zhangsan", city:"北京", age:18}    fmt.Printf("p4=%#v\n", p4)}

结构体方法和接收者

结构体说明

在 go 语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法。所谓方法就是定义了接收者的函数。

Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。

方法的定义格式如下:

func (接收者变量 接收者类型) 方法名(参数列表) (返回值) {函数体}

结构体方法和接收者

给结构体 Person 定义一个方法打印 Person 的信息

type Person struct {    name string    age int8} func (p Person) printInfo() {    fmt.Printf("姓名:%v 年龄:%v", p.name, p.age) // 姓名:小王子 年龄:25} func main() {    p1 := Person{        name: "小王子",        age: 25,    }    p1.printInfo() // 姓名:小王子 年龄:25}

值类型和指针类型接收者

实例1:给结构体 Person 定义一个方法打印 Person 的信息

值类型的接收者

指针类型的接收者

方法大部分时候是自己处理自己的数据,总结如下:

Go Struct结构体如何实现

encoding-json包

1. struct与json

比如我们 Golang 要给 App 或者小程序提供 Api 接口数据,这个时候就需要涉及到结构体和Json 之间的相互转换。

struct转Json字符串

type Student struct {ID intGender stringname string //私有属性不能被 json 包访问Sno string} func main() { var s1 = Student{    ID: 1,    Gender: "男",    name: "李四",    Sno: "s0001",} fmt.Printf("%#v\n", s1) // main.Student{ID:1, Gender:"男", name:"李四",Sno:"s0001"}var s, _ = json.Marshal(s1)jsonStr := string(s)fmt.Println(jsonStr) // {"ID":1,"Gender":"男","Sno":"s0001"}}

Json字符串转struct

type Student struct {ID intGender stringName stringSno string} func main() {    var jsonStr = `{"ID":1,"Gender":"男","Name":"李四","Sno":"s0001"}`    var student Student //定义一个 Monster 实例    err := json.Unmarshal([]byte(jsonStr), &student)    if err != nil {    fmt.Printf("unmarshal err=%v\n", err)} // 反序列化后 student=main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}student.Name="张三"fmt.Printf("反序列化后 student=%#v student.Name=%v \n", student, student.Name)}

2. struct tag

1)Tag标签说明

具体的格式如下:

key1:"value1" key2:"value2"

注意事项:

为结构体编写 Tag 时,必须严格遵守键值对的规则。

结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在 key 和 value 之间添加空格。

Tag结构体转化Json字符串

type Student struct {ID int `json:"id"` //通过指定 tag 实现 json 序列化该字段时的 key(表示在做json操作的时候,用json指定的字段名)Gender string `json:"gender"`Name stringSno string} func main() {    var s1 = Student{    ID: 1,    Gender: "男",    Name: "李四",    Sno: "s0001",} // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}fmt.Printf("%#v\n", s1)var s, _ = json.Marshal(s1)jsonStr := string(s)fmt.Println(jsonStr) // {"id":1,"gender":"男","Name":"李四","Sno":"s0001"}}

Json字符串转成Tag结构体

type Student struct {    ID int `json:"id"` //通过指定 tag 实现 json 序列化该字段时的 key    Gender string `json:"gender"`    Name string    Sno string} func main() {    var s2 Student    var str = `{"id":1,"gender":"男","Name":"李四","Sno":"s0001"}`    err := json.Unmarshal([]byte(str), &s2)    if err != nil {    fmt.Println(err)    }    // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"}    fmt.Printf("%#v", s2)}

读到这里,这篇“Go Struct结构体如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯