结构体(struct)是用户自定义的类型,它代表若干字段的集合。有些时候将多个数据看做一个整体要比单独使用这些数据更有意义,这种情况下就适合使用结构体。

比如将一个员工的 firstName, lastName 和 age 三个属性打包在一起成为一个 employee 结构就是很有意义的。

结构体的声明

type Employee struct {
firstName string
lastName string
age int
}

上面的代码片段声明了一个名为 Employee 的结构体类型,它拥有 firstName, lastName 和 age 三个字段。同一类型的多个字段可以合并到一行(用逗号分隔),并将类型放在后面。上面的结构体中 firstName 与 lastName 都是 string 类型,因此可以将它们写在一起。

type Employee struct {
firstName, lastName string
age, salary int
}

上面的结构体 Employee 是一个具名结构体(named structure),因为它创建了一个具有名字的结构体类型: Employee。我们可以定义具名结构体类型的变量。

我们也可以定义一个没有类型名称的结构体,这种结构体叫做匿名结构体(anonymous structures)。

var employee struct {
firstName, lastName string
age int
}

定义具名结构体变量

下面的程序说明了如何定义一个具名结构体 Employee 的变量。

package main

import (
"fmt"
) type Employee struct {
firstName, lastName string
age, salary int
} func main() { //creating structure using field names
emp1 := Employee{
firstName: "Sam",
age: ,
salary: ,
lastName: "Anderson",
} //creating structure without using field names
emp2 := Employee{"Thomas", "Paul", , } fmt.Println("Employee 1", emp1)
fmt.Println("Employee 2", emp2)
}

在上面的程序中,我们定义了一个名为 Employee 的结构体类型。我们可以通过指定字段的名称和对应的值来创建一个结构体变量,比如在第15行,我们就是通过这种方式定义了 Employee 类型的一个结构体变量 empl。这里字段名称的顺序没必要和声明结构体类型时的一致。例如这里我们将 lastName 放在了最后,程序同样正确运行。

在定义结构体变量时也可以忽略字段名称,例如在第 23 行,我们定义 emp2 时没有指定字段名称。但是通过这种方式定义的结构体变量时,字段值的顺序必须与声明结构体类型时字段的顺序保持一致。

上面的程序输出如下:

Employee  {Sam Anderson  }
Employee {Thomas Paul }

定义匿名结构体变量

package main

import (
"fmt"
) func main() {
emp3 := struct {
firstName, lastName string
age, salary int
}{
firstName: "Andreah",
lastName: "Nikola",
age: ,
salary: ,
} fmt.Println("Employee 3", emp3)
}

在上面的程序中,第3行定义了一个 匿名结构体变量 emp3。正如我们提到的一样,这种结构体成为匿名结构体,因为它只创建了一个新的结构体变量 emp3,而没有定义新的结构体类型。

程序的输出为:

Employee  {Andreah Nikola  }  

访问结构体中的字段

使用点 . 操作符来访问结构体中的字段。

package main

import (
"fmt"
) type Employee struct {
firstName, lastName string
age, salary int
} func main() {
emp6 := Employee{"Sam", "Anderson", , }
fmt.Println("First Name:", emp6.firstName)
fmt.Println("Last Name:", emp6.lastName)
fmt.Println("Age:", emp6.age)
fmt.Printf("Salary: $%d", emp6.salary)
}

在上面的程序中,通过 emp6.firstName 访问 emp6 中的字段 firstName程序的输出为:

First Name: Sam
Last Name: Anderson
Age:
Salary: $

结构体指针

可以定义指向结构体的指针。

package main

import (
"fmt"
) type Employee struct {
firstName, lastName string
age, salary int
} func main() {
emp8 := &Employee{"Sam", "Anderson", , }
fmt.Println("First Name:", (*emp8).firstName)
fmt.Println("Age:", (*emp8).age)
}

在上面的程序中 emp8 是一个指向结构体 Employee 的指针。(*emp8).firstName 是访问 emp8 中 firstName 字段的语法。程序的输出为:

First Name: Sam
Age:

在 Go 中我们可以使用 emp8.firstName 替代显示解引用 (*emp8).firstName 来访问 firstName 字段。

package main

import (
"fmt"
) type Employee struct {
firstName, lastName string
age, salary int
} func main() {
emp8 := &Employee{"Sam", "Anderson", , }
fmt.Println("First Name:", emp8.firstName)
fmt.Println("Age:", emp8.age)
}

在上面的程序中,我们使用了 emp8.firstName 访问 firstName,程序的输出如下:

First Name: Sam
Age:

本文摘自:https://blog.csdn.net/u011304970/article/details/75030994

Golang教程:结构体的更多相关文章

  1. golang | Go语言入门教程——结构体初始化与继承

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...

  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操作结构体、Map转化为JSON

    结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...

  5. golang初始化结构体数组

    最近组里新项目要求用go来写,没办法只能边看文档边写代码,今天遇到郁闷的问题,查了好久最终发现居然是一个标点符号的导致的,遂纪录之 刚刚给一个接口写单元测试时想初始化一个结构体数组,然后遍历该数组并建 ...

  6. [Objective-C语言教程]结构体(17)

    Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项. 结构体用于表示记录,假设要图书馆中跟踪书 ...

  7. golang之结构体使用注意事项和细节

    1. 结构体的所有字段在内在中是连续的 2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字.个数和类型) 3. 结构体进行type重新定义(相当于取别名),Golang认 ...

  8. golang(07)结构体介绍

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

  9. Golang通过结构体解析和封装XML

    Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...

  10. golang 对结构体进行格式化输出

    可以使用 `return fmt.Sprintf("%+v", *conf) ` 来打印结构体,包括结构体的key值.但是由于结构体内容较多,都在一行,所以希望可以格式化输出结构体 ...

随机推荐

  1. fhq treap——简单又好写的数据结构

    今天上午学了一下fhq treap感觉真的很好用啊qwq 变量名解释: \(size[i]\)表示以该节点为根的子树大小 \(fix[i]\)表示随机权值 \(val[i]\)表示该节点的值 \(ch ...

  2. 201621123023《Java程序设计》第4周学习总结

    一.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.覆盖.重载 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 二.书面作业 1. 面 ...

  3. linux LVM 磁盘管理

    一.linux LVM 管理及创建步骤 步骤:1.创建pv—2.创建vg—3.将pv加入vg—4.在vg中创建lv—5.将lv分区格式化—6.将lv分区挂载到某个目录使用 1.创建PV [root@z ...

  4. bzoj2754:[SCOI2012]喵星球上的点名(后缀自动机)

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  5. 使用concat做字符串拼接和数据迁移

    作用: 解决一开始数据库建立不合理造成的字段冗余,从而提取部分字段,数据迁移.拼接字符串的功能. 格式: concat(字段1,'间隔符',字段2....) concat_ws('间隔符',字段1,字 ...

  6. scrapy框架基于CrawlSpider的全站数据爬取

    引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...

  7. [Swift]堆栈Stack的两种版本:(1)用类包装Stack (2)用泛型包装Stack

    堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的 ...

  8. Objective-C适用C数学函数 <math.h>

    在实际工作中有些程序不可避免的需要使用数学函数进行计算,比如地图程序的地理坐标到地图坐标的变换.Objective-C做为ANSI C的扩展,使用C标准库头文件<math.h>中定义的数学 ...

  9. ubuntu15.04下安装jdk8

    前几天手贱,删掉了ubuntu自带的java,最后安装时遇到了Picked up JAVA_TOOL_OPTIONS的问题,经过网上各种找,终于被我弄成功了.下面将经验下载下面供大家方便: jdk8的 ...

  10. 2016级算法第四次上机-E.Bamboo and the Ancient Spell

    Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...