Go 语言中结构体(Struct)的使用
创始人
2025-05-29 00:57:40
0

文章目录

    • 简介
    • 定义结构体
    • 创建结构体对象
    • 结构体嵌套
    • 结构体方法
    • 可见性
    • 结论

简介

Go 语言是一门典型的面向对象编程语言,同时也支持复杂的数据结构,其中最常用的就是结构体。

结构体(Struct)是一组不同类型的变量的集合,可以像一个单一的变量一样使用,可以包含其他结构体或嵌套的结构体。在 Go 语言中,结构体是一种自定义类型,可以定义在函数外部,并且可以定义方法。

定义结构体

定义结构体的语法如下:

type Person struct {Name     stringAge      intGender   stringAddress  string
}

上面的语法就定义了一个名为 Person 的结构体,其包含四个字段:Name、Age、Gender 和 Address,这四个字段分别是 string、int、string 和 string 类型。

创建结构体对象

结构体定义好之后,可以使用该结构体来创建对象。下面这段代码演示了如何使用定义好的 Person 结构体来创建一个 person 对象:

person := Person{Name    : "Tom",Age     : 25,Gender  : "male",Address : "ShenZhen",
}

上面的代码就创建了一个名为 person 的 Person 结构体对象,并设置了其属性值。

访问结构体成员

可以使用句点运算符 . 来访问结构体中的成员。例如,要访问 person 结构体对象中的 Name 属性,可以使用以下代码:

fmt.Println(person.Name)

打印结果为 “Tom”。

结构体嵌套

结构体可以定义在其他结构体中,从而实现结构体嵌套的功能。例如,一个嵌套在 Person 结构体中的 Address 结构体可以定义如下:

type Address struct {Province     stringCity         stringStreet       stringHouseNumber  string
}type Person struct {Name     stringAge      intGender   stringAddress  Address
}

上面的代码就定义了一个名为 Address 的结构体和一个名为 Person 的结构体,在 Person 结构体中嵌套了 Address 结构体,从而实现了结构体的嵌套功能。

结构体方法

在 Go 语言中,结构体还可以定义方法,即与结构体相关联的函数。在方法定义中,可以使用结构体的成员来执行一些操作。

下面这段代码就定义了一个名为 SayHello 的方法,该方法属于 Person 结构体:

type Person struct {Name     stringAge      intGender   stringAddress  Address
}func (p Person) SayHello() {fmt.Println("Hello, my name is", p.Name)
}

上面的代码中,方法的定义类似于函数的定义,但在方法名前面加上了 (p Person) 这个结构体定义,表示将该方法绑定到 Person 结构体中。SayHello 方法将输出 “Hello, my name is” 加上该 person 对象的名字。

使用结构体对象调用方法的方式如下:

person := Person{Name    : "Tom",Age     : 25,Gender  : "male",Address : "ShenZhen",
}
person.SayHello()

打印结果为 “Hello, my name is Tom”。

在 Go 语言中,结构体(struct)的大小写规则会影响结构体及其字段是否能被跨包访问。按照 Go 语言的结构体大小写规则,如下:

可见性

小写字母开头的结构体和结构体字段仅能在同一个包中访问,不能跨包访问。
大写字母开头的结构体和结构体字段可以在不同的包中被访问,是公共的(public)。
这是因为在 Go 语言中,变量、常量、函数等标识符的大小写决定了它们的可见性(visibility),即能否被其他包访问。因此,如果希望将结构体和结构体字段公开(对外可见),则需要使用大写字母开头的标识符。

举个例子,假设我们有以下代码:

package main// 定义一个结构体
type Person struct {name  stringage   int
}func main() {// 创建一个 Person 变量p := Person{"Alice", 18}// 打印变量fmt.Printf("%v\n", p)
}

由于结构体字段都是小写字母开头的,因此在 main 函数中无法直接访问这些字段,编译错误。需要将字段改为大写字母开头才能被跨包访问,例如:

package mainimport "fmt"// 定义一个结构体
type Person struct {Name stringAge  int
}func main() {// 创建一个 Person 变量p := Person{"Alice", 18}// 访问 Name 字段fmt.Printf("Name: %v\n", p.Name)
}

在这个例子中,Person 结构体的 Name 和 Age 字段被定义为公开的(public),在 main 函数中可以通过访问 p.Name 来获取结构体实例 p 的名称。
同样的道理, 结构体的方法名称和结构体本身名称也是符合这个规则的.

结论

结构体是 Go 语言中一种强大的自定义类型,它可以包含任意数量的数据类型,甚至可以包括其他结构体或者嵌套结构体。结构体提供了一种方便的方式,让开发者能够轻松地管理复杂的数据集合。同时,结构体还具有定义方法的功能,可以与其他类型一起工作,更加方便实现面向对象编程的功能。

相关内容

热门资讯

为青年学子埋下科学的种子 转自:团结报  本报新乡讯 近日,民革河南省委会卫生健康委员会“科健中原”医学科普宣讲团走进河南科技...
美国“新内战”风险陡增?   本报记者 吴娜  “这是美国历史上罕见的‘联邦政府搞乱州政府’案例。”——美国问题专家接受本报记...
天津百利特精电气股份有限公司股... 股票简称:百利电气 股票代码:600468 公告编号:2025-024天津百利特精电气股份有限公司...
麦收的一天   眉豆  5月底的一个中午,站在办公室窗前,看着被白炽灯般阳光照射着的马路和摇摆的白杨树叶,一股带...
华北地区抗战档案首次集中亮相   本报记者 李祺瑶  昨天,“胜利烽火——纪念中国人民抗日战争暨世界反法西斯战争胜利80周年京津冀...
山西华阳新材料股份有限公司关于... 证券代码:600281 证券简称:华阳新材 公告编号:临2025-032山西华阳新材料股份有限公司...
非中选高价药品使用将受监控   本报讯(记者 柴嵘)近日,本市进一步完善医药集中带量采购执行机制,强化对非中选高价药品的监管,要...
部分地区高考结束 转自:中国妇女报  6月9日,在长沙市第一中学考点,考生在高考结束后庆祝。  当日,全国部分地区高考...
房山一拾荒老人家中清出近1吨废...   本报讯(记者 张宇)在房山区一居民小区,一位72岁的老人长期拾荒囤积家中,不仅对自己和邻居的消防...
新余钢铁股份有限公司第十届董事... 证券代码:600782 证券简称:新钢股份 公告编号:临2025-042新余钢铁股份有限公司第十届...
合富(中国)医疗科技股份有限公... 证券代码:603122 证券简称:合富中国 公告编号:临2025-025合富(中国)医疗科技股份有...
四川路桥建设集团股份有限公司第... 证券代码:600039证券简称:四川路桥公告编号:2025-058四川路桥建设集团股份有限公司第八届...
中美经贸磋商机制首次会议将继续... 当地时间6月9日下午,中美经贸磋商机制首次会议在英国伦敦举行。记者了解到,当地时间6月10日,中美经...
“苏超”破圈,解码文体旅融合的... 转自:中国妇女报  □ 中国妇女报全媒体记者 茹希佳  “看‘苏超’真是太欢乐了”  “比赛第一,友...
千年家训滋养新时代“家和万事兴... 转自:中国妇女报  □ 中国妇女报全媒体记者 姚建  当千年祠堂的“敦亲睦邻”匾额下响起现代调解的掌...
上海物资贸易股份有限公司第十届... 证券代码:600822 证券简称:上海物贸 编号:临 2025-018900927 物贸B股上海物...
赛轮集团股份有限公司关于增资控... 证券代码: 601058 证券简称:赛轮轮胎 公告编号:临2025-047赛轮集团股份有限公司关...
越挫越勇的名人名言 越挫越勇的名人名言 1、从不获胜的人很少失败,从不攀登。——印度2、除非你停止尝试,否则就永远不...
最终幻想水晶编年史-命运之轮第... 最终幻想水晶编年史-命运之轮第三章雪山入口怎么打开 我按错没看到教学详细解释首先,在进入时候会有莫咕...
桂花雨主要内容 桂花雨主要内容写了作者自己最喜欢桂花,喜欢它迷人的香气,接着写了摇桂花的事情,最后写了离开家乡后赏桂...