我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么快速学会Go的struct数据类型

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么快速学会Go的struct数据类型

本篇内容主要讲解“怎么快速学会Go的struct数据类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么快速学会Go的struct数据类型”吧!

什么是结构体

结构是表示字段集合的用户定义类型。它可以用于将数据分组为单个单元而不是将每个数据作为单独的值的地方。

例如,员工有firstName、lastName和age。将这三个属性分组到一个名为Employee

type Employee struct {      firstName string    lastName  string    age       int}

上面的代码段声明了一个结构类型Employee,其中包含字段firstName、lastName和age。上面的Employee结构称为命名结构,因为它创建了一个名为Employme的新数据类型,可以使用该数据类型创建Employ结构。

通过在一行中声明属于同一类型的字段,然后在类型名称后面加上该字段,也可以使该结构更加紧凑。在上面的struct中,firstName和lastName属于同一类型字符串,因此该struct可以重写为:

type Employee struct {      firstName, lastName string    age                 int}

尽管上面的语法节省了几行代码,但它并没有使字段声明显式。请避免使用上述语法。

创建结构体

让我们使用以下简单程序声明一个命名的structEmployee。

package mainimport (      "fmt")type Employee struct {      firstName string    lastName  string    age       int    salary    int}func main() {    //creating struct specifying field names    emp1 := Employee{        firstName: "Sam",        age:       25,        salary:    500,        lastName:  "Anderson",    }    //creating struct without specifying field names    emp2 := Employee{"Thomas", "Paul", 29, 800}    fmt.Println("Employee 1", emp1)    fmt.Println("Employee 2", emp2)}

在上述程序的第7行中,我们创建了一个命名的结构类型Employee。在上述程序的第17行中,emp1结构是通过为每个字段名指定值来定义的。声明结构类型时,字段的顺序不必与字段名的顺序相同。在这种情况下。我们已更改lastName的位置并将其移到末尾。这将不会有任何问题。

在上述程序的第25行中,通过省略字段名来定义emp2。在这种情况下,必须保持字段的顺序与结构声明中指定的顺序相同。请避免使用此语法,因为它会使您难以确定哪个字段的值。我们在此处指定此格式只是为了理解这也是一个有效语法:)

以上程序打印为:

Employee 1 {Sam Anderson 25 500}  
Employee 2 {Thomas Paul 29 800}

创建匿名结构体

可以在不创建新数据类型的情况下声明结构。这些类型的结构称为匿名结构。

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

在上述程序的第8行中,定义了一个匿名结构变量emp3。正如我们已经提到的,这个结构称为anonymous,因为它只创建一个新的结构变量emp3,而没有定义任何新的结构类型,如命名结构。

上述代码打印的结果为:

Employee 3 {Andreah Nikola 31 5000}

访问结构体字段

运算符.用于访问结构的各个字段。

package mainimport (      "fmt")type Employee struct {      firstName string    lastName  string    age       int    salary    int}func main() {      emp6 := Employee{        firstName: "Sam",        lastName:  "Anderson",        age:       55,        salary:    6000,    }    fmt.Println("First Name:", emp6.firstName)    fmt.Println("Last Name:", emp6.lastName)    fmt.Println("Age:", emp6.age)    fmt.Printf("Salary: $%d\n", emp6.salary)    emp6.salary = 6500    fmt.Printf("New Salary: $%d", emp6.salary)}

上面程序中的emp6.firstName访问emp6结构的firstName字段。在第25行中,我们修改了员工的工资。此程序打印。

First Name: Sam  
Last Name: Anderson  
Age: 55  
Salary: $6000  
New Salary: $6500

结构体零值

当定义了一个结构并且没有用任何值显式初始化它时,默认情况下会为该结构的字段分配零值。

package mainimport (      "fmt")type Employee struct {      firstName string    lastName  string    age       int    salary    int}func main() {      var emp4 Employee //zero valued struct    fmt.Println("First Name:", emp4.firstName)    fmt.Println("Last Name:", emp4.lastName)    fmt.Println("Age:", emp4.age)    fmt.Println("Salary:", emp4.salary)}

上面的程序定义了emp4,但没有用任何值初始化。因此,firstName和lastName被指定为字符串的零值,字符串为空字符串“”,age和salary被指定为零值int,即0。此程序打印

First Name:  
Last Name:  
Age: 0  
Salary: 0

也可以为某些字段指定值,而忽略其余字段。在这种情况下,被忽略的字段被赋值为零。

package mainimport (      "fmt")type Employee struct {      firstName string    lastName  string    age       int    salary    int}func main() {      emp5 := Employee{        firstName: "John",        lastName:  "Paul",    }    fmt.Println("First Name:", emp5.firstName)    fmt.Println("Last Name:", emp5.lastName)    fmt.Println("Age:", emp5.age)    fmt.Println("Salary:", emp5.salary)}

在上面的程序中。第16号和第17号,firstName和lastName被初始化,而年龄和薪水没有初始化。因此,年龄和工资被指定为零值。此程序输出:

First Name: John  
Last Name: Paul  
Age: 0  
Salary: 0

结构体指针

也可以创建指向结构的指针。

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

上面程序中的emp8是指向Employee结构的指针。(*emp8)。firstName是访问emp8结构的firstName字段的语法。此程序打印:

First Name: Sam  
Age: 55

Go语言为我们提供了使用emp8.firstName而不是显式取消引用(*emp8)的选项。firstName以访问firstName字段。

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

我们已经使用emp8.firstName访问上述程序中的firstName字段,该程序还输出:

First Name: Sam  
Age: 55

匿名字段

可以使用只包含类型而不包含字段名的字段创建结构。这类字段称为匿名字段。下面的代码段创建了一个struct Person,它有两个匿名字段string和int:

type Person struct {      string    int}

即使匿名字段没有显式名称,默认情况下,匿名字段的名称是其类型的名称。例如,在上面的Person结构中,虽然字段是匿名的,但默认情况下它们采用字段类型的名称。所以Person结构有两个字段,分别是名称字符串和int。

package mainimport (      "fmt")type Person struct {      string    int}func main() {      p1 := Person{        string: "naveen",        int:    50,    }    fmt.Println(p1.string)    fmt.Println(p1.int)}

在上述程序的第17行和第18行中,我们访问Person结构的匿名字段,使用它们的类型作为字段名,分别是string和int。上述程序的输出为:

naveen  
50

结构体嵌套

结构可能包含字段,而字段又是结构。这些类型的结构称为嵌套结构。

package mainimport (      "fmt")type Address struct {      city  string    state string}type Person struct {      name    string    age     int    address Address}func main() {      p := Person{        name: "Naveen",        age:  50,        address: Address{            city:  "Chicago",            state: "Illinois",        },    }    fmt.Println("Name:", p.name)    fmt.Println("Age:", p.age)    fmt.Println("City:", p.address.city)    fmt.Println("State:", p.address.state)}

上述程序中的Person结构具有字段地址,而字段地址又是一个结构。此程序打印:

Name: Naveen  
Age: 50  
City: Chicago  
State: Illinois

字段升级

属于结构中匿名结构字段的字段称为提升字段,因为可以像访问包含匿名结构字段结构一样访问它们。我可以理解这个定义相当复杂,所以让我们深入研究一些代码来理解它。

type Address struct {      city string    state string}type Person struct {      name string    age  int    Address}

在上面的代码段中,Person结构有一个匿名字段Address,它是一个结构。现在,Address的字段,即city和state,被称为promoted字段,因为可以像直接在Person结构本身中声明一样访问它们。

package mainimport (      "fmt")type Address struct {      city  string    state string}type Person struct {      name string    age  int    Address}func main() {      p := Person{        name: "Naveen",        age:  50,        Address: Address{            city:  "Chicago",            state: "Illinois",        },    }    fmt.Println("Name:", p.name)    fmt.Println("Age:", p.age)    fmt.Println("City:", p.city)   //city is promoted field    fmt.Println("State:", p.state) //state is promoted field}

在上面程序的第29行和第30行中,可以访问提升字段city和state,就好像它们是使用语法p.city和p.state在结构p中声明的一样。此程序打印:

Name: Naveen  
Age: 50  
City: Chicago  
State: Illinois

结构体导出

如果结构类型以大写字母开头,则它是导出类型,可以从其他包访问。类似地,如果结构的字段以caps开头,则可以从其他包访问它们。让我们编写一个具有自定义包的程序来更好地理解这一点。在Documents目录中创建名为structs的文件夹。请随意在任何您喜欢的地方创建它。我更喜欢我的文档目录。

mkdir ~/Documents/structs

创建一个gomod,并命名为structs

cd ~/Documents/structs/  
go mod init structs

创建另外一个目录computer申明一个结构体。

mkdir computer

创建一个spec.go文件,并写入如下内容:

package computertype Spec struct { //exported struct      Maker string //exported field    Price int //exported field    model string //unexported field}

上面的代码片段创建了一个程序包计算机,其中包含一个导出的结构类型Spec,其中有两个导出的字段Maker和Price,以及一个未导出的字段模型。让我们从主包导入这个包并使用Spec结构。

创建名为main的文件。进入structs目录并在main.go中编写以下程序:

package mainimport (      "structs/computer"    "fmt")func main() {      spec := computer.Spec {            Maker: "apple",            Price: 50000,        }    fmt.Println("Maker:", spec.Maker)    fmt.Println("Price:", spec.Price)}

这个结构体如下结构体:

├── structs
│   ├── computer
│   │   └── spec.go
│   ├── go.mod
│   └── main.go

在上面程序的第4行,我们导入计算机包。在第13行和第14行,我们访问struct Spec的两个导出字段Maker和Price。这个程序可以通过执行命令go-install,然后执行structs命令来运行。

go install  
structs

运行之后如下结果:

Maker: apple  
Price: 50000

如果我们试图访问未报告的字段模型,编译器会抱怨。更换main的内容。使用以下代码。

package mainimport (      "structs/computer"    "fmt")func main() {      spec := computer.Spec {            Maker: "apple",            Price: 50000,            model: "Mac Mini",        }    fmt.Println("Maker:", spec.Maker)    fmt.Println("Price:", spec.Price)}

在上述程序的第12行中,我们尝试访问未报告的字段模型。运行此程序将导致编译错误。

# structs
./main.go:12:13: unknown field 'model' in struct literal of type computer.Spec

由于模型字段未报告,因此无法从其他包访问它。

结构体比较

结构是值类型,如果它们的每个字段都是可比较的,则可以进行比较。如果两个结构变量的对应字段相等,则认为它们相等。

package mainimport (      "fmt")type name struct {      firstName string    lastName  string}func main() {      name1 := name{        firstName: "Steve",        lastName:  "Jobs",    }    name2 := name{        firstName: "Steve",        lastName:  "Jobs",    }    if name1 == name2 {        fmt.Println("name1 and name2 are equal")    } else {        fmt.Println("name1 and name2 are not equal")    }    name3 := name{        firstName: "Steve",        lastName:  "Jobs",    }    name4 := name{        firstName: "Steve",    }    if name3 == name4 {        fmt.Println("name3 and name4 are equal")    } else {        fmt.Println("name3 and name4 are not equal")    }}

在上面的程序中,名称结构类型包含两个字符串字段。由于字符串是可比较的,因此可以比较类型名的两个结构变量。在上面的程序中,name1和name2相等,而name3和name4不相等。此程序将输出:

name1 and name2 are equal  
name3 and name4 are not equal

如果结构变量包含不可比较的字段,那么它们就不可比较(感谢reddit的alasija指出这一点)。

package mainimport (      "fmt")type image struct {      data map[int]int}func main() {      image1 := image{        data: map[int]int{            0: 155,        }}    image2 := image{        data: map[int]int{            0: 155,        }}    if image1 == image2 {        fmt.Println("image1 and image2 are equal")    }}

在上面的程序中,图像结构类型包含类型映射的字段数据。地图是不可比较的,因此无法比较image1和image2。如果运行此程序,编译将失败并返回错误。

./prog.go:20:12: invalid operation: image1 == image2 (struct containing map[int]int cannot be compared)

到此,相信大家对“怎么快速学会Go的struct数据类型”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么快速学会Go的struct数据类型

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么快速学会Go的struct数据类型

本篇内容主要讲解“怎么快速学会Go的struct数据类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么快速学会Go的struct数据类型”吧!什么是结构体结构是表示字段集合的用户定义类型。它
2023-07-05

一文教你如何快速学会Go的struct数据类型

结构是表示字段集合的用户定义类型。它可以用于将数据分组为单个单元而不是将每个数据作为单独的值的地方。本文就来和大家聊聊Go中struct数据类型的使用,需要的可以参考一下
2023-03-07

怎么快速学会Go的切片和数组数据类型

这篇文章主要介绍“怎么快速学会Go的切片和数组数据类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么快速学会Go的切片和数组数据类型”文章能帮助大家解决问题。什么是数组数组是属于同一类型的元素的
2023-07-05

一文教你如何快速学会Go的切片和数组数据类型

数组是属于同一类型的元素的集合。切片是数组顶部的方便、灵活且功能强大的包装器。本文就来和大家聊聊Go中切片和数组的使用,需要的可以参考一下
2023-03-07

Redis数据类型简介(十分钟快速学习Redis)

如何在ubuntu18.04上安装和保护redis如何连接到Redis数据库如何管理Redis数据库和Keys如何在Redis中管理副本和客户端如何在Redis中管理字符串如何在Redis中管理list如何在Redis中管理Hashes如何在Redis中管理S
Redis数据类型简介(十分钟快速学习Redis)
2018-09-27

在成都的怎么快速学会Java

对于零基础学习JAVA 的人来说,学习Java非常困难,而且要学习好JAVA,要花大量的时间和精力学习JAVA。 那么java该如何学习,怎么快速学会学习?JAVA要掌握正确的方法,要学会坚持。虽然刚开始入门非常的困难,但是入门之后,所有的
2023-06-02

Go语言数据类型转换实战指南:快速入门教程

快速上手Go语言数据类型转换:实战教程引言:数据类型转换在程序开发中经常会遇到,特别是在处理不同类型之间的数据交互时尤为常见。在Go语言中,数据类型转换非常简单和高效。本文将通过实战教程,介绍Go语言中的数据类型转换,并给出具体的代码示例
Go语言数据类型转换实战指南:快速入门教程
2024-01-13

Go基本数据类型与string类型怎么互转

本篇内容介绍了“Go基本数据类型与string类型怎么互转”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、基本数据类型转string类型方
2023-07-05

快速学会在Go语言中进行字符串到数组的转换

快速学会在Go语言中进行字符串到数组的转换在Go语言中,字符串与数组之间的转换是一个常见的操作,特别是在处理数据时经常会遇到需要将字符串转换为数组的情况。本文将介绍如何在Go语言中快速学会实现字符串到数组的转换,让你能够轻松应对类似的问题
快速学会在Go语言中进行字符串到数组的转换
2024-03-12

Go语言中的数据类型有哪些及类型间怎么转换

这篇“Go语言中的数据类型有哪些及类型间怎么转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的数据类型有哪些及类
2023-06-30

go语言的数据类型有什么用

这篇文章主要讲解了“go语言的数据类型有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言的数据类型有什么用”吧!go语言是谷歌2009发布的开源编程语言。Go语言最初由Googl
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录