iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么快速学会Go的struct数据类型
  • 365
分享到

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

2023-07-05 10:07:00 365人浏览 八月长安
摘要

本篇内容主要讲解“怎么快速学会Go的struct数据类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么快速学会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数据类型”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么快速学会Go的struct数据类型

本文链接: https://www.lsjlt.com/news/350946.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么快速学会Go的struct数据类型
    本篇内容主要讲解“怎么快速学会Go的struct数据类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么快速学会Go的struct数据类型”吧!什么是结构体结构是表示字段集合的用户定义类型。它...
    99+
    2023-07-05
  • 一文教你如何快速学会Go的struct数据类型
    目录什么是结构体创建结构体创建匿名结构体访问结构体字段结构体零值结构体指针匿名字段结构体嵌套字段升级结构体导出结构体比较什么是结构体 结构是表示字段集合的用户定义类型。它可以用于将数...
    99+
    2023-03-07
    Go struct数据类型 Go struct
  • 怎么快速学会Go的切片和数组数据类型
    这篇文章主要介绍“怎么快速学会Go的切片和数组数据类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么快速学会Go的切片和数组数据类型”文章能帮助大家解决问题。什么是数组数组是属于同一类型的元素的...
    99+
    2023-07-05
  • 一文教你如何快速学会Go的切片和数组数据类型
    目录什么是数组声明数组数组是值类型数组的长度迭代数组多维数组切片创建切片修改切片切片长度和容量使用make创建切片切片追加切片作为函数参数多维切片什么是数组 数组是属于同一类型的元素...
    99+
    2023-03-07
    Go切片 数组 Go切片 Go 数组
  • 怎么快速学会CSS
    这篇文章主要介绍“怎么快速学会CSS”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么快速学会CSS”文章能帮助大家解决问题。什么是 CSS?CSS(层叠样式表)——英文 Cascading Sty...
    99+
    2023-06-27
  • 在成都的怎么快速学会Java
    对于零基础学习JAVA 的人来说,学习Java非常困难,而且要学习好JAVA,要花大量的时间和精力学习JAVA。 那么java该如何学习,怎么快速学会学习JAVA要掌握正确的方法,要学会坚持。虽然刚开始入门非常的困难,但是入门之后...
    99+
    2023-06-02
  • Java IDE开发技术:如何快速学习数据类型?
    Java是一种基于类和对象的编程语言,它的核心就是数据类型。在Java中,数据类型分为基本数据类型和引用数据类型两种。其中基本数据类型包括整型、浮点型、字符型和布尔型,而引用数据类型则包括类、接口、数组等。了解和掌握Java的数据类型,是...
    99+
    2023-08-28
    ide 开发技术 数据类型
  • go语言中基本数据类型及应用快速了解
    目录整数特殊的整数类型如果想确定int和uint的大小溢出浮点数复数布尔值字符串字符串的“长度”与遍历字符串的做法字符串的“长度”遍历...
    99+
    2024-04-02
  • 如何快速学习Go编程中的Apache服务器和数据类型?专家分享笔记!
    Go编程语言是一种开源编程语言,由谷歌公司于2009年发布,它是一种高效的编程语言,具有快速编译、高效内存管理和并发编程的特点。Apache服务器是一种流行的Web服务器软件,它可以用于发布静态或动态的Web内容。在本文中,我们将重点介绍...
    99+
    2023-10-20
    apache 学习笔记 数据类型
  • 学习 Go:什么是对象和数据类型?
    在 Go 语言中,对象和数据类型是相互关联的概念,它们是编程的基石。在本篇文章中,我们将深入探讨对象和数据类型的概念,并且会穿插演示代码,以帮助读者更好地理解这些概念。 什么是对象? 在计算机科学领域中,对象指的是可以被处理的实体,它可以...
    99+
    2023-06-25
    对象 数据类型 ide
  • Go语言数据类型转换实战指南:快速入门教程
    快速上手Go语言数据类型转换:实战教程 引言:数据类型转换在程序开发中经常会遇到,特别是在处理不同类型之间的数据交互时尤为常见。在Go语言中,数据类型转换非常简单和高效。本文将通过实战教程,介绍Go语言中的数...
    99+
    2024-01-13
    Go语言 数据类型转换 快速上手
  • Go基本数据类型与string类型怎么互转
    本篇内容介绍了“Go基本数据类型与string类型怎么互转”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、基本数据类型转string类型方...
    99+
    2023-07-05
  • 快速学会在Go语言中进行字符串到数组的转换
    快速学会在Go语言中进行字符串到数组的转换 在Go语言中,字符串与数组之间的转换是一个常见的操作,特别是在处理数据时经常会遇到需要将字符串转换为数组的情况。本文将介绍如何在Go语言中快...
    99+
    2024-03-12
    go语言 数组 字符串转换
  • 一文快速搞懂Redis的几种数据类型方式
    目录Redis简介Redis有几种数据类型Redis的基本指令String(字符串)List(列表)Set(集合)Hash(哈希)Zset(sorted set:有序集合)RedisDesktopManager数据查看工...
    99+
    2024-04-02
  • Apache 中的 PHP 数据类型教程:快速入门指南
    PHP 是一种流行的服务器端编程语言,它广泛应用于 Web 应用程序的开发和维护。在 PHP 中,数据类型是非常重要的,因为它们决定了我们如何使用和处理数据。在本文中,我们将介绍 PHP 中的各种数据类型,并提供一些示例代码帮助您更好地理...
    99+
    2023-10-06
    数据类型 教程 apache
  • 教你学会w10怎么把网速调到最快
    有不少网友反应自己的win10系统上网速度比较慢,在不改变硬件的情况下,想了解w10怎么把网速调到最快。其实是可以通过一些win10电脑设置调整win10网速的。下面小编就教下大家w10把网速调到最快的方法。1、首先右击开始菜单,选择运行,...
    99+
    2023-07-10
  • 快速掌握MySQL常用数据类型:常见数据类型及其应用场景一览
    MySQL是一种常用的关系型数据库管理系统,它提供了多种数据类型来存储不同类型的数据。在使用MySQL进行数据库设计和开发时,了解常见的数据类型及其应用场景非常重要。本文将介绍MySQL常用的数据类型,并提供一些具体的代码示例,...
    99+
    2024-01-29
    MySQL数据类型 常用数据类型 数据类型应用场景
  • Windows数据类型与Go语言数据类型的异同点。
    Windows数据类型与Go语言数据类型的异同点 在计算机编程中,数据类型是非常重要的一个概念。不同的编程语言所支持的数据类型也不同。本文将重点探讨Windows数据类型和Go语言数据类型之间的异同点。 Windows数据类型 Window...
    99+
    2023-09-12
    windows 数据类型 关键字
  • 重学Go语言之基础数据类型详解
    目录前言布尔型数字类型整型浮点型复数字符串小结前言 Go语言有非常强大的数据类型系统,其支持的数据类型大体上可分为四类:基础数据类型、引用数据类型、接口类型、复合类型。 基础数据类型...
    99+
    2023-02-28
    Go语言基础数据类型 Go语言数据类型 Go 数据类型
  • 想要成为数据处理高手?先学会Java和numpy的数据类型!
    在当今信息化时代,数据已经成为了一种非常重要的资产。企业和机构需要对数据进行处理和分析,以便从中获取有价值的信息。如果你想成为一名数据处理的高手,那么你需要掌握一些基本的工具,其中包括Java和numpy的数据类型。 Java是一种面向对...
    99+
    2023-06-21
    numpy 数据类型 教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作