struct 称为结构体,它可以用来描述现实中的一些事物对象

它定义了一些不同类型的变量,用这些不同的变量类型来描述事物对象的属性

格式

type 结构体名 struct {}

定义并初始化结构体

方法一

package mainimport "fmt"type Student struct {Name stringId stringAge string
}func main() {var student Studentstudent.Name = "陈九礼"student.Age = "9999"student.Id = "1314520"fmt.Println(student)
}

输出

{陈九礼 1314520 9999}

方法二

package mainimport "fmt"type Student struct {Name stringId stringAge string
}func main() {student := Student{Name: "陈九礼",}fmt.Println(student)
}

输出

{陈九礼  }

方法二在这里要注意几点

  • 如果只想定义结构体,不想初始化结构体,那么结构体后面的 { }也别忘记添加
  • 如果你要初始化一些变量,那么在变量值后,都要给它加上一个逗号 ,
  • 可以不全部初始化完毕,也可以全部初始化完

结构体函数

在某些语言中,里面没有结构体,也没有函数。例如Java,有的只是类还有类中的方法。

在go中,也是有着跟结构体搭配在一起的函数,虽然长的样子跟函数有点差不多

但跟普通函数不一样的是,结构体函数的调用只能通过函数去调用

结构体函数的格式

func (变量名 结构体类型) 方法名([参数]) [返回类型]{ [函数体] }

[ ]表示可选的意思

结构体类型有两种:

1.指针类型的
2.普通类型的

后面会展示两种类型的样子

结构体函数的使用

指针类型的结构体函数

package mainimport "fmt"type Student struct {Name stringId stringAge string
}func (student *Student) setName(name string) {student.Name = name
}func main() {student := Student{}student.setName("陈九礼")fmt.Println("学生姓名:", student.Name)
}

输出

学生姓名: 陈九礼

普通类型的结构体函数

package mainimport "fmt"type Student struct {Name stringId stringAge string
}func (student *Student) setName(name string) {student.Name = name
}func (student Student) setAge(age string) {student.Age = age
}func main() {student := Student{}student.setName("陈九礼")student.setAge("9999")fmt.Println("学生姓名:", student.Name)fmt.Println("学生年龄:", student.Age)
}

输出

学生姓名: 陈九礼
学生年龄:

从输出可以看出,如果用的是普通类型的结构体,那么修改的值,并不会作用到原对象

普通类型结构体函数和指针类型结构体函数的区别

以下仅个人说法:

其实在结构体的函数中,我更愿意称结构体函数为:跟结构体绑定的函数

无论用的是普通绑定还是指针类型去绑定,都是说这个函数属于这个结构体的

普通类型结构体函数,你可以这么认为,就是我们调用这个函数的时候,结构体传入的是原本结构体的副本(也就是复制了一份过去),所以你修改了这个副本,并不会影响到原来的结构体

指针类型结构体函数,每次调用这个函数的时候,结构体传入的是这个结构体的指针(这里不纠结是值传递还是指针传递),函数可以根据这个结构体的指针,对原结构体里面的内容加以操作,这些操作,会作用于原结构体中

调用的时候,看做结构体是从这里传递进去的

结构体变量的作用范围

在学结构体之前,我们都学过了,变量的作用范围

变量的作用范围是被变量名大小控制的

main.go

package mainimport "fmt"type Student struct {Name stringId stringage string
}func main() {student := Student{age: "9999",Name: "陈九礼",}fmt.Println(student)fmt.Println("同个包,但是不同文件中的函数:")testScope()
}

test.go

package mainimport "fmt"func testScope() {student := Student{age: "8888",Name: "陈陈陈",}fmt.Println(student)
}

输出

{陈九礼  9999}
同个包,但是不同文件中的函数:
{陈陈陈  8888}

从输出可以看出,在同一个包下,变量名的大小写的作用范围一样

结构体内的结构体变量

显示指定结构体变量名

package mainimport "fmt"type Person struct {Name stringage string
}type Student struct {person PersonId string
}func main() {student := Student{person: Person{Name: "陈九礼",age: "9999",},Id: "1314520",}fmt.Println("通过显示调用Name: ", student.person.Name)fmt.Println("通过显示调用age: ", student.person.age)fmt.Println("调用Id", student.Id)
}

输出

通过显示调用Name:  陈九礼
通过显示调用age:  9999
调用Id 1314520

隐示指定结构体变量名

package mainimport "fmt"type Person struct {Name stringage string
}type Student struct {PersonId string
}func main() {student := Student{Person: Person{Name: "陈九礼",age: "9999",},Id: "1314520",}fmt.Println("通过person调用Name: ", student.Person.Name)fmt.Println("直接调用age: ", student.age)fmt.Println("调用Id: ", student.Id)}

输出

通过person调用Name:  陈九礼
直接调用age:  9999
调用Id:  1314520

通过隐示指定结构体变量名的方式,我们有两种调用属性的方式

第一种是直接调用嵌套函数的变量(如果外层结构体变量没有跟内层结构体变量重名的话)

第二种是间接调用,外层结构体调用内存结构体再调用到里面的变量


欢迎大家关注下个人的「公众号」:独醉贪欢

struct的基本使用-go篇相关推荐

  1. c#中Class和Struct使用与性能的区别

    在Unity中很多已经定义为结构体的数据结构 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class为引用类型,Struc ...

  2. Linux中断(interrupt)子系统之二:arch相关的硬件封装层

    Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得驱动程序的开发人员不用关注底层的实现,要实现这个目标,内核的开发者们必须把硬件相关的内容剥离出来,然后定义一些列标准的 ...

  3. epoll哪些触发模式_epoll的内部实现 百万级别句柄监听 lt和et模式非常好的解释...

    epoll是Linux高效网络的基础,比如event poll(例如nodejs),是使用libev,而libev的底层就是epoll(只不过不同的平台可能用epoll,可能用kqueue). epo ...

  4. Linux下gmtime、gmtime_r、localtime、localtime_r函数详解

    函数功能介绍 使用man gmtime或man localtime都可以的得到这几个函数的介绍.原型如下: struct tm *gmtime(const time_t *timep); struct ...

  5. swift 3.0 再探索 - 1.String

    swift 3.0 - 1.String 最近有空可以学习点新东西,有段时间在学习java和mySQL,转方向没那么快可以做到,眼下iOS 10 和 Xcode8正式版准备上线,swift3.0也标示 ...

  6. 对象拼接 请求路径_Tensorflow Rust实战下篇[整合actix-web提供http服务]

    上一篇我写的文章Tensorflow Rust实战上篇. 这一次我们看看使用tensorflow建立了什么,并通过http接口提供服务.随着Actix Web1.0版本发布,我认为用它构建一些东西将是 ...

  7. 【iOS开发】从Cocoa框架说开去--Fundation框架系列

    [Cocoa简介] Cocoa是苹果公司为Mac OS X所创建的原生面向对象API 是Mac OS X上五大API之一.(其他四个:Carbon POSIX X11 Java)它是苹果的面向对象开发 ...

  8. c语言描述考试答案,c语言期末试题

    篇一:c语言期末试题 试卷编号:10183 所属语言:Turbo C 试卷方案:fny-13 试卷总分:110分 共有题型:7种 ━━━━━━━━━━━━━━ 一.填空 共5题 (共计15分) ━━━ ...

  9. struct用法_精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

  10. 三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题

    Python进阶篇-struct字节对齐问题 Python进阶篇-struct字节对齐问题 Python调用C的时候,会传递一些复杂的数据结构,例如结构体,这时候就会遇到各种各样字节对齐的问题.下边所 ...

最新文章

  1. yjk只算弹性的不计算弹塑性_基于ANSYS Workbench的表面裂纹计算
  2. 腾讯DCI上线基于集中控制的SR-TE方案
  3. WindowsPhone8可缩放图片控件的实现
  4. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
  5. python php 网站_python php网站
  6. java多线程02-----------------synchronized底层实现及JVM对synchronized的优化
  7. 换一种途径看信息,享受快捷 RSS阅读----willack.liu[原创]
  8. 标准盒模型和怪异盒模型小结
  9. clover懒人_懒人气球驱动的互联网毕竟可能不是一个愚蠢的想法
  10. 剑指offe——61序列化二叉树(Python)
  11. 蒙特卡洛方法(Monte Carlo method,也有翻译成“蒙特卡罗方法”)
  12. java将秒转换为天,时,分
  13. 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之5---移动增值服务走进生活
  14. Codeforces Round #802 (Div. 2)
  15. java mysql 日志解析_otter4.2.17在解析日志时报错(mysql数据库版本为5.7.3-m13)
  16. ios中wallproxy使用教程
  17. eclipse编辑器怎么加入c语言,如何在eclipse中配置进行C语言开发。
  18. JAVA 中的 - 是什么意思?
  19. 关于nn.embedding的中padding_idx的含义
  20. 使用Excel批量生成SQL语句,用过的人都说好

热门文章

  1. Divide by Zero 2021 and Codeforces Round #714 (Div. 2)B. AND Sequences(位运算 + 思维 + 排列)
  2. workflow (1)
  3. java简易计算器报告_简易计算器java实训报告.docx
  4. 网页知识入门-浏览器和网页生成
  5. Renew 、Revive 、Renovate、Update、Refresh区别
  6. 上海网站备案人工服务器,上海网站备案中心
  7. 初来乍到,余生请多指教
  8. SpringSecurity 密码加密
  9. python elif是什么意思_python elif是什么意思
  10. 怎样解决问题 《how to slove it》 《在代码大全里》