结构struct

  • Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能
  • 使用type struct{} 定义结构,名称遵循可见性规则
  • 支持指向自身的指针类型成员
  • 支持匿名结构,可用作成员或定义成员变量
  • 匿名结构也可以用于map的值
  • 可以使用字面值对结构进行初始化
  • 允许直接通过指针来读写结构成员
  • 相同类型的成员可进行直接拷贝赋值
  • 支持==与!=比较运算符,但不支持>或<
  • 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  • 嵌入结构作为匿名字段看起来像继承,但不是继承
  • 可以使用匿名字段指针
  • tag是结构体的元信息,可以在运行的时候通过反射机器读取出来;字段类型的后面,以反引号扩起来的key-value结构的字符串,多个tag以逗号隔开。

结构的定义

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct { //结构也是一中类型
  6. Name string //定义struct的属性
  7. Age int
  8. }
  9. func main() {
  10. a := Person{}
  11. a.Name = "joe" //对struct的属性进行操作,类型与class的使用方法
  12. a.Age = 19
  13. fmt.Println(a)
  14. }

字面值初始化

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := Person{
  11. Name: "jack",
  12. Age: 19, //对结构的属性进行字面值的初始化
  13. }
  14. fmt.Println(a)
  15. }

结构的传递

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := Person{
  11. Name: "jack",
  12. Age: 19, //对结构的属性进行字面值的初始化
  13. }
  14. fmt.Println(a)
  15. A(a)
  16. fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
  17. }
  18. func A(per Person) {
  19. per.Age = 13
  20. fmt.Println("A", per)
  21. }
  22. PS G:\mygo\src\mytest> go run .\temp.go
  23. {jack 19}
  24. A {jack 13}
  25. {jack 19}
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := Person{
  11. Name: "jack",
  12. Age: 19, //对结构的属性进行字面值的初始化
  13. }
  14. fmt.Println(a)
  15. A(&a)
  16. fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
  17. }
  18. func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
  19. per.Age = 13
  20. fmt.Println("A", per)
  21. }
  22. PS G:\mygo\src\mytest> go run .\temp.go
  23. {jack 19}
  24. A &{jack 13}
  25. {jack 13}
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := &Person{
  11. Name: "jack",
  12. Age: 19, //此时初始化的时候就将这个struct的指针取出来
  13. }
  14. //在进行struct的初始化的时候,就加上&取地址符号
  15. fmt.Println(a)
  16. A(a)
  17. B(a)
  18. fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
  19. }
  20. func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
  21. per.Age = 13
  22. fmt.Println("A", per)
  23. }
  24. func B(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
  25. per.Age = 15
  26. fmt.Println("B", per)
  27. }
  28. PS G:\mygo\src\mytest> go run .\temp.go
  29. &{jack 19}
  30. A &{jack 13}
  31. B &{jack 15}
  32. &{jack 15}

匿名结构

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. a := &struct { //匿名结构,需要先对结构本身进行一个定义
  7. Name string
  8. Age int
  9. }{
  10. Name: "jack",
  11. Age: 20,
  12. }
  13. fmt.Println(a)
  14. }

匿名结构的嵌套

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. Contact struct {
  9. Phone, City string //匿名结构嵌套在Person中
  10. }
  11. }
  12. func main() {
  13. a := Person{Name: "Jack", Age: 20}
  14. a.Contact.Phone = "123321" //通过这种方法对嵌套在Person中的匿名结构进行字面值的初始化
  15. a.Contact.City = "BeiJing"
  16. fmt.Println(a)
  17. }
  18. PS G:\mygo\src\mytest> go run .\temp2.go
  19. {Jack 20 {123321 BeiJing}}

匿名字段

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. string //匿名字段 在进行字面值初始化的时候 必须严格按照字段声明的顺序
  7. int
  8. }
  9. func main() {
  10. a := Person{"Jack", 20} //此时将string 和 int类型对调的时候就会报错
  11. fmt.Println(a)
  12. }

结构相同类型的比较

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := Person{Name: "Jack", Age: 20}
  11. b := Person{Name: "Jack", Age: 20}
  12. fmt.Println(a == b)
  13. }
  14. PS G:\mygo\src\mytest> go run .\temp3.go
  15. true

嵌入结构

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type human struct {
  6. Sex int
  7. }
  8. type teacher struct {
  9. human
  10. Name string
  11. Age int
  12. }
  13. type student struct {
  14. human //这里的human也是一种类型,此时它相当于一种匿名字段,嵌入结构作为匿名字段的话
  15. //它本质上是将结构名称作为我们的字段名称
  16. Name string
  17. Age int
  18. }
  19. func main() {
  20. a := teacher{Name: "Jack", Age: 20, human: human{Sex: 0}} //因此我们需要在这里进行这种初始化
  21. b := student{Name: "Tom", Age: 19, human: human{Sex: 1}}
  22. a.Name = "Fack"
  23. a.Age = 13
  24. a.human.Sex = 100 //保留这种调用的方法,是因为会涉及到名称的冲突
  25. //a.Sex = 101 这种写法也是可以的
  26. fmt.Println(a, b)
  27. }
  28. PS G:\mygo\src\mytest> go run .\temp3.go
  29. {{100} Fack 13} {{1} Tom 19}

tag的详解

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type User struct {
  7. Username string `json:"username"`
  8. Sex string `json:"sex"`
  9. Age int
  10. AvatarUrl string
  11. }
  12. func main() {
  13. user := &User{
  14. Username: "user01",
  15. Sex: "男",
  16. Age: 18,
  17. AvatarUrl: "http://xxx.xxx.com/xxx.png",
  18. }
  19. data, _ := json.Marshal(user)
  20. fmt.Printf("json str:%s\n", string(data))
  21. }

Golang struct结构的更多相关文章

  1. golang struct结构体初始化的几种方式

    type User struct { Id int `json:"id" orm:"auto"` // 用户名 Username string `json:&q ...

  2. Golang 入门 : 结构体(struct)

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...

  3. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  4. golang struct

    ex1 /* https://golangbot.com/structs/ struct 结构 结构就是一组字段. */ package main import "fmt" // ...

  5. Golang Struct 声明和使用

    Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...

  6. go struct结构体

    struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...

  7. [Golang] struct Tag说明

    在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...

  8. golang(07)结构体介绍

    golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...

  9. 3.11 Go Struct结构体

    3.11 Go Struct结构体 Golang支持OOP面向对象编程. Go的结构体struct如同python的class. Go基于struct实现OOP特性,只有组合composition这个 ...

随机推荐

  1. linux文件的基本属性

    Linux 文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规 ...

  2. GT工具中用到的英文词解释

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...

  3. selenium IDE工具页面介绍!

    selenium IDE工具页面,常用功能点介绍

  4. TensorFlow从1到2(八)过拟合和欠拟合的优化

    <从锅炉工到AI专家(6)>一文中,我们把神经网络模型降维,简单的在二维空间中介绍了过拟合和欠拟合的现象和解决方法.但是因为条件所限,在该文中我们只介绍了理论,并没有实际观察现象和应对. ...

  5. SpringBoot之旅第三篇-日志

    一.前言 日志对于一个系统的重要性不言而喻,日志能帮我们快速定位线上问题,市场上存在非常多的日志框架,比较常见的有 JUL,JCL,Log4j,Log4j2,Logback.SLF4j.jboss-l ...

  6. 使用Elasticsearch的动态索引和索引优化

    关于映射 实际工作中使用过ES的朋友可能会有和静儿一样的感受.ES存储更新从编码上是很方便.如下,Kubernetes的yaml文件完全可以通过json直接序列化一下,一行代码存入ES. 剩下的工作可 ...

  7. 使用docker-compose 一键部署你的分布式调用链跟踪框架skywalking

    一旦你的程序docker化之后,你会遇到各种问题,比如原来采用的本地记日志的方式就不再方便了,虽然你可以挂载到宿主机,但你使用 --scale 的话,会导致 记录日志异常,所以最好的方式还是要做日志中 ...

  8. vivo机器如何无需root激活XPOSED框架的流程

    在大多运行室的引流或者业务操作中,理论上需要使用安卓的神一般的Xposed框架,上周我们运行室购来了一批新的vivo机器,理论上都是基于7.0以上系统版本,理论上不能够获得root的su权限,虽然一部 ...

  9. Kindle Windows版本 中文字体修改工具

    近来想要用Windows看Kindle电子书,无奈Windows 版本的Kindle不能修改中文字体,非常难看.把Kindle拉到IDA PRO看了一下,发现Kindle Windows版本的中文字体 ...

  10. WinForm DataGridView双向数据绑定

    程序目标: 实现DataGridView与BindingList<T>双向绑定.用户通过DataGridView修改值后立即更新BindList对象的值,代码修改BindList后立即更新 ...