链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。


1 结构体类型

有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。

结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。

2 结构体初始化

2.1 普通变量

type Student struct {

id   intname stringsex  byteage  intaddr string

}

func main() {

//1、顺序初始化,必须每个成员都初始化var s1 Student = Student{1, "mike", 'm', 18, "sz"}s2 := Student{2, "yoyo", 'f', 20, "sz"}//s3 := Student{2, "tom", 'm', 20} //err, too few values in struct initializer//2、指定初始化某个成员,没有初始化的成员为零值s4 := Student{id: 2, name: "lily"}

}

2.2 指针变量

type Student struct {

id   intname stringsex  byteage  intaddr string

}

func main() {

var s5 *Student = &Student{3, "xiaoming", 'm', 16, "bj"}s6 := &Student{4, "rocco", 'm', 3, "sh"}

}

3 结构体成员的使用

3.1 普通变量

//===============结构体变量为普通变量

//1、打印成员var s1 Student = Student{1, "mike", 'm', 18, "sz"}//结果:id = 1, name = mike, sex = m, age = 18, addr = szfmt.Printf("id = %d, name = %s, sex = %c, age = %d, addr = %s\n", s1.id, s1.name, s1.sex, s1.age, s1.addr)//2、成员变量赋值var s2 Students2.id = 2s2.name = "yoyo"s2.sex = 'f's2.age = 16s2.addr = "guangzhou"fmt.Println(s2) //{2 yoyo 102 16 guangzhou}

3.2 指针变量

//===============结构体变量为指针变量

//3、先分配空间,再赋值s3 := new(Student)s3.id = 3s3.name = "xxx"fmt.Println(s3) //&{3 xxx 0 0 }//4、普通变量和指针变量类型打印var s4 Student = Student{4, "yyy", 'm', 18, "sz"}fmt.Printf("s4 = %v, &s4 = %v\n", s4, &s4) //s4 = {4 yyy 109 18 sz}, &s4 = &{4 yyy 109 18 sz}var p *Student = &s4//p.成员 和(*p).成员 操作是等价的p.id = 5(*p).name = "zzz"fmt.Println(p, *p, s4) //&{5 zzz 109 18 sz} {5 zzz 109 18 sz} {5 zzz 109 18 sz}

4 结构体比较

如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用== 或 != 运算符进行比较,但不支持 > 或 < 。

func main() {

s1 := Student{1, "mike", 'm', 18, "sz"}s2 := Student{1, "mike", 'm', 18, "sz"}fmt.Println("s1 == s2", s1 == s2) //s1 == s2 truefmt.Println("s1 != s2", s1 != s2) //s1 != s2 false

}

5 结构体作为函数参数

5.1 值传递

func printStudentValue(tmp Student) {

tmp.id = 250//printStudentValue tmp =  {250 mike 109 18 sz}fmt.Println("printStudentValue tmp = ", tmp)

}

func main() {var s Student = Student{1, “mike”, ‘m’, 18, “sz”}

printStudentValue(s)        //值传递,形参的修改不会影响到实参fmt.Println("main s = ", s) //main s =  {1 mike 109 18 sz}

}

5.2 引用传递

func printStudentPointer(p *Student) {

p.id = 250//printStudentPointer p =  &{250 mike 109 18 sz}fmt.Println("printStudentPointer p = ", p)

}

func main() {

var s Student = Student{1, "mike", 'm', 18, "sz"}printStudentPointer(&s)     //引用(地址)传递,形参的修改会影响到实参fmt.Println("main s = ", s) //main s =  {250 mike 109 18 sz}

}

6 可见性

Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。

要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母开头。

目录结构:

test.go示例代码如下:

//test.gopackage test

//student01只能在本文件件引用,因为首字母小写type student01 struct {

Id   intName string

}

//Student02可以在任意文件引用,因为首字母大写type Student02 struct {

Id   intname string

}

main.go示例代码如下:

// main.gopackage main

import (

"fmt""test" //导入test包

)

func main() {

//s1 := test.student01{1, "mike"} //err, cannot refer to unexported name test.student01//err, implicit assignment of unexported field 'name' in test.Student02 literal//s2 := test.Student02{2, "yoyo"}//fmt.Println(s2)var s3 test.Student02 //声明变量s3.Id = 1             //ok//s3.name = "mike"  //err, s3.name undefined (cannot refer to unexported field or method name)fmt.Println(s3)

}

GO语言编程基础-复合类型结构体相关推荐

  1. C++编程:复合数据类型—结构体

    实际应用中,我们往往希望把很多不同的信息组合起来,"打包"存储在一个单元中.比如一个学生的信息,可能包含了姓名.年龄.班级.成绩-这些信息的数据类型可能是不同的,所以数组和vect ...

  2. 遍历结构体_三菱ST语言编程(3)——结构体变量

    上篇文章介绍了数组,是一组相同类型数据的列表,那么不同类型的数据能否组合到一起用一个标签表示呢?答案当然是可以的,而实现这个功能的就是结构体(struct). 建立结构体 在三菱结构化编程的界面中左侧 ...

  3. c语言编程单向,一道关于结构体和单向链表的C语言编程题求助各位大佬!!!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近,Kale发现他的手机地址簿不能添加新朋友的电话号码.他转而寻求你的帮助,因为他知道你正在学习高级编程语言.为了帮助他,你需要根据以下要求设计一个新的 ...

  4. c语言send发送结构体,Socket编程中用send发送结构体

    Socket编程中用send发送结构体 原创 2010年04月28日 19:17:00 标签:socket /编程 /struct /google /string /input 11868 最近在开发 ...

  5. C语言自定义变量类型——结构体详解

    文章目录 前言 为什么要学习结构体 什么是结构体 一.结构体:struct 1.结构体类型的声明 (1)结构体的基础知识 (2)结构体的声明 (3)特殊的声明 2.结构体的自引用 3.结构体变量的定义 ...

  6. Go语言中的复合类型及面向对象思想

    1.结构体 struct 定义格式: type 结构体名称 struct {属性1 类型属性2 类型... } 结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一 ...

  7. c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...

    中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc 中等职业学校计算机应用专业C语言编程基础科试卷及答案一.填空(共35分)1.Unix系统诞生于 年,是由 实验室的K和用汇编语言开发成功的 ...

  8. c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...

    C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...

  9. Go 语言快速入门指南:结构体

    Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 1. 类型别名和自 ...

最新文章

  1. Proxy 动态代理 InvocationHandler CGLIB MD
  2. Android动画之Frame Animation
  3. HiveQL基本操作整理
  4. vscode中如何运行git
  5. js字符串转数字(小数),数字转字符串
  6. Android Studio SVN配置忽略文件 1.用Android Studio创建一个项目,会在根目录和Module目录下自动生成.gitignore文件,貌似是Git的配置文件,
  7. C++算法学习(贪心算法)
  8. 酷派N900刷机教程
  9. 国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)
  10. 网页中透明Flash的设置
  11. Kali、linux中安装软件
  12. 解决百度地图生成器添加标注后图标不显示的问题
  13. Java模拟醉汉行走问题_醉汉随机行走/随机漫步问题(Random Walk Drunk Python)
  14. (笔记)数据结构——顺序表
  15. 邮件撤回怎么操作?个人邮箱Outlook登录入口在哪?
  16. Keil MDK526 相同变量 突出显示
  17. TortoiseSVN上传文件显示被锁定
  18. 信息脱敏---字符、姓名、邮箱、手机、固定电话,银行卡号、地址、身份证号脱敏处理
  19. [android图片压缩]一款不错的图片压缩,值得学习!
  20. 重磅!数字人民币接入支付宝!

热门文章

  1. 【数据库】 兴唐第二十七节课只sql注入
  2. WKWebView Safari调试、JS互调、加载进度条、JS中alert、confirm、prompt
  3. x9此计算机上没有hasp_mastercam x9安装步骤
  4. 仿斗鱼聊天:基于CoreText的面向对象图文排版工具AWRichText
  5. u-charts 曲线图中间有部分没数据,导致点和点无法连成线的问题解决
  6. Error: Cannot find module ‘express‘
  7. js删除组数中的某一个元素(完整代码附效果图)
  8. 异步系统接口调用流程图
  9. 入职五年回顾(八) 2013年3月
  10. h5 getUserMedia error PermissionDeniedError