起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > IT培训 > Go语言中什么是结构体?老男孩Golang培训班

Go语言中什么是结构体?老男孩Golang培训班

时间:2022-01-19 16:35:51来源:未知 作者:老男孩教育 已有: 名学员访问该课程

  快捷搜索:

前言:Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 struct特点 1、用来自定义复杂数据结构 2、struct里面可以包含一个或多个字段(属性) 3、struct类型可以定义方法,注意和函数的区分 4、struct类型

  Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

  结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

  struct特点

  1、用来自定义复杂数据结构

  2、struct里面可以包含一个或多个字段(属性)

  3、struct类型可以定义方法,注意和函数的区分

  4、struct类型是值类型

  5、struct类型可以嵌套

  6、结构体是用户单独定义的类型,不能和其他类型进行强制转换

  7、Go中的struct没有构造函数,一般可以使用工厂模式来解决这个问题

  8、我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化

  9、访问结构体成员, 用 "." 来连接,格式为:"结构体.成员名"

  struct定义

  可用 type 在全局或函数内定义新类型。

  第一种,定义一个新的数据类型,结构体中只有一个成员。

  type bigint int64

  type smallint int8

  新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系,不会持有原类型任何信息。除非目标类型是未命名类型,否则必须显式转换。

  第二种,定义一个新的数据类型,结构体中有多个成员。

  type oldboy struct {

  Linux string

  Python string

  Golang string

  }

  第三种,定义一个新的数据类型,指向结构体的指针。

  type Linux string

  type oldboy struct {

  *Linux

  }

  不能同时嵌入某一类型和其指针类型,因为它们名字相同。实例如下:

  package main

  type Linux string

  type oldboy struct {

  *Linux

  Linux

  }

  func main() {

  }

  编译错误:

  ./main.go:7:2: duplicate field Linux

  struct 初始化

  有序初始化: 结构体中的多个成员的值,必须一一对应。

  无序初始化: 结构体中的多个成员的值,无须一一对应,可初始化部分值。

  package main

  type oldboy struct {

  Linux string

  Python string

  Golang string

  }

  // 有序初始化

  var ordered = oldboy{"linux", "python", "golang"}

  // 无序初始化

  var disordered = oldboy{Golang: "golang"}

  func main() {

  }

  结构体初始化方法有如下几种:

  package main

  import (

  "fmt"

  )

  type oldboy struct {

  int

  string

  }

  var one oldboy

  func main() {

  two := new(oldboy) //同 var two *oldboy = new(oldboy)

  three := oldboy{1, "three"}

  four := oldboy{}

  five := &oldboy{}

  six := &oldboy{2, "six"} //同 var six *oldboy = &oldboy{2, "six"}

  fmt.Println(one, two, three, four, five, six)

  }

  one three four返回oldboy类型变量;two five six返回*oldboy类型变量;若无初始化值,则默认为零值。

  匿名字段

  定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。

  当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

  package main

  import (

  "fmt"

  )

  type Person struct {

  name string

  age int

  addr string

  }

  type Employee struct {

  Person //匿名字段

  salary int

  int //用内置类型作为匿名字段

  addr string //类似于重载

  }

  func main() {

  em1 := Employee{

  Person{"oldboy", 18, "北京"},

  10,

  100,

  "首都",

  }

  fmt.Println(em1)

  var em2 Person = em1.Person

  fmt.Println(em2)

  }

  struct与tag应用

  声明struct结构的时候,在属性的右侧用小米点括起来的内容叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如转成json格式,实例如下:

  package main

  import (

  "encoding/json"

  "fmt"

  )

  type User struct {

  UserId int

  UserName string

  }

  type UserTag struct {

  UserId int `json:"user_id" bson:"user_id"`

  UserName string `json:"user_name" bson:"user_name"`

  }

  func main() {

  user := &User{UserId: 1, UserName: "oldboy"}

  json_user, _ := json.Marshal(user)

  fmt.Printf("struct User echo : %v\n", string(json_user))

  user_tag := &UserTag{UserId: 1, UserName: "oldboy"}

  json_user_tag, _ := json.Marshal(user_tag)

  fmt.Printf("struct UserTag echo : %v\n", string(json_user_tag))

  }

  运行结果:

  struct User echo : {"UserId":1,"UserName":"oldboy"}

  struct UserTag echo : {"user_id":1,"user_name":"oldboy"}

  标签是struct类型的组成部分:

  package main

  var user1 struct {

  UserId int `json:"user_id"`

  }

  var user2 struct {

  UserId int `bson:"user_id"`

  }

  func main() {

  user1 = user2

  }

  编译错误:

  ./main.go:11:8: cannot use user2 (type struct { UserId int "bson:\"user_id\"" }) as type struct { UserId int "json:\"user_id\"" } in assignment

  老男孩教育专注Linux云计算运维工程师、Python全栈+人工智能、Python自动化运维开发、网络安全、数据分析、新媒体运营、MySQLDBA开发、K8S微服务、Go语言等互联网课程培训。欢迎对it行业感兴趣的朋友们来公司考察及学习。

文章出自:http://qh.itpxw.cn/peixun/it/2022103018.html

文章标题:Go语言中什么是结构体?老男孩Golang培训班



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

(责任编辑:深圳学历教育网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
老男孩教育 访问该机构站点 报名留言 加为好友 用户等级:高级会员 用户级别:0 机构名称:老男孩教育 联 系 人:任女士 联系电话:18710030740 联系手机:18710030740 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件:768386696@qq.com 网站域名:https://www.oldboyedu.com/ 注册时间:2019-03-20 15:03 最后登录:2023-02-02 13:02
推荐内容