英语原文共 22 页,剩余内容已隐藏,支付完成后下载完整资料
结构和接口
当您编写程序时,您选择语言的类型系统非常重要。类型允许您以结构化的方式组织应用程序数据,这些数据可以持久化到各种数据存储中;当您编写应用程序,尤其是业务应用程序时,您可以使用各种类型组织应用程序数据,并将这些类型的值持久化到持久性存储中;当你编写应用程序时,了解它的类型系统和它的设计理念是很重要的。Go提供了各种内置类型,如int、uint、float64、string和bool。用于存储数组、切片和映射等值集合的数据结构称为复合类型,因为它们由其他类型-内置类型和用户定义类型组成。除了Go所提供的内置类型之外,您还可以通过与其他类型结合创建您自己的类型。本章包含了用户定义类型的方法。
Go为它的类型系统提供了简单和实用主义,因为语言为各种各样的东西做了很多语言规范。Go的类型系统是为解决现实世界的问题而设计的,而不是过于依赖学术理论,并且在为应用程序设计数据模型时避免了很多复杂性。Go的面向对象方法不同于其他语言,例如c 、Java和c#。Go在它的类型系统中不支持继承,它甚至没有一个类的关键词。Go有一个struct类型,它类似于类,如果您想要比较Go的类型系统和其他面向对象语言的类型系统。Go的struct类型是一个轻量级的类,它遵循一个独特的设计,支持组合而不是继承。
一、创建用户定义的类型
bull;问题
您希望创建用户定义的类型来组织应用程序数据。
bull;解决方案
Go有一个结构类型,它允许您通过与其他类型结合创建用户定义的类型。
bull;它是如何工作的
Go struct可以通过组合一个或多个类型(包括内置的和用户定义的类型)来创建自己的类型。结构是在Go中创建具体用户定义类型的惟一方法。当您创建您自己的类型使用struct,很重要的一点是理解Go在它的类型系统中不提供对继承的支持,但是它支持类型的组合,可以通过组合较小的类型来创建更大的类型。Go的设计理念是通过组合更小的组件和模块化的组件来创建更大的组件。如果你是一个务实的程序员,你将会欣赏到的设计哲学,因为它的实际好处,有利于组合而不是继承。类型的继承有时会在可维护性方面引入实际的挑战。
- 声明结构体类型
关键字结构用于声明类型为struct。清单3-1展示了一个表示客户信息的示例结构。
清单3 - 1:声明结构体类型
type Customer struct{
FirstName string
LastName string
Email string
Phone string
}
一个struct类型的客户被声明有四个字段的字符串类型。注意,Customer struct及其字段被导出到其他包,因为标识符以大写字母开头。在Go中,如果名称以大写字母开头,标识符将被导出到其他包;否则,可访问性将限制在包内。如果一组struct字段有一个公共类型,那么可以在单行语句中组织相同类型的字段,如清单3-2所示。
清单3 - 2:声明结构体类型
type Customer struct {
FirstName, LastName, Email, Phone string
}
因为客户结构的所有字段都具有字符串类型,因此可以在单个语句中指定字段。
- 创建结构类型的实例
您可以通过声明一个struct变量或使用struct文字来创建struct类型的实例。.清单3-3展示了通过声明struct变量并将值赋给struct的字段来创建Customer struct实例的代码块。
清单3 - 3:创建一个Struct实例并分配值
var c Customer
c.FirstName = 'Alex'
c.LastName = 'John'
c.Email = 'alex@email.com'
c.Phone = '732-757-2923'
创建了Customer类型的实例,并逐个将值分配给struct字段。结构文字也可以用来创建结构类型的实例。清单3-4展示了通过使用struct文本并将值赋值给struct的字段来创建Customer struct实例的代码块。
清单3 - 4:使用Struct文字创建结构实例。
c := Customer{
FirstName: 'Alex',
LastName: 'John',
Email: 'alex@email.com',
Phone: '732-757-2923',
}
使用struct文本创建Customer类型的实例,并将值分配给struct字段。注意,即使初始化到struct的最后一个字段,也会添加一个逗号。当您使用struct literal创建结构实例时,您可以将值初始化为多行语句,但您必须在分配到struct字段后再加上逗号。在清单3-4中,通过指定struct字段来初始化值。如果您清楚地知道字段的顺序,则可以在初始化值时省略字段标识符,如清单3-5所示。
清单3 - 5:使用Struct文字创建结构实例
c := Customer{
'Alex',
'John',
'alex@email.com',
'732-757-2923',
}
当您使用struct literal创建struct实例时,您可以向struct的特定字段提供值,如清单3-6所示。
清单3 - 6:通过将值指定给几个字段来创建结构实例
c := Customer{
FirstName: 'Alex',
Email: 'alex@email.com',
}
- 使用用户定义的类型作为字段的类型
客户结构是使用内置类型的字段创建的。您可以使用其他struct类型作为struct字段的类型。让我们通过添加一个新的字段来将地址信息作为新字段的类型,来扩展客户结构。清单3-7显示了客户结构的扩展,它添加了一个新字段,其类型为地址类型的一部分。
清单3 - 7:Customer Struct,它有一个用户定义类型的片段作为字段的类型
type Address struct {
Street, City, State, Zip string
IsShippingAddress bool
}
type Customer struct {
FirstName, LastName, Email, Phone string
Addresses []Address
}
客户结构通过添加一个新字段(地址)扩展,该字段被指定为一个名为Address的结构。使用地址字段,您可以为客户指定多个地址。IsShippingAddress字段用于指定默认的送货地址。清单3-8展示了创建这个修改后的客户结构实例的代码块。
清单3 - 8:创建客户结构的实例
c := Customer{
FirstName: 'Alex',
LastName: 'John',
Email: 'alex@email.com',
Phone: '732-757-2923',
Addresses: []Address{
Address{
Street: '1 Mission Street',
City: 'San Francisco',
State: 'CA',
Zip: '94105',
IsShippingAddress: true,
},
Address{
Street: '49 Stevenson Street',
City: 'San Francisco',
State: 'CA',
Zip: '94105',
},
},
}
地址字段通过创建一个带有两个值长度的地址类型来初始化。
- 向结构类型添加方法
bull;问题
您希望将行为添加到struct类型中,以在结构上提供被称为方法的操作。
bull;解决方案
Go的类型系统允许您使用方法接收器为结构类型添加方法。接收机的方法。指定哪些类型必须将函数关联为该类型的方法。
bull;它是如何工作的
在Go中,方法是用接收器指定的函数。让我们向客户结构添加一个方法。
func (c Customer) ToString() string {
return fmt.Sprintf('Customer: %s %s, Email:%s', c.FirstName, c.LastName, c.Email)
}
将一个方法字符串添加到客户结构中。接收方是在方法名之前使用额外的参数部分指定的。在方法中,您可以使用receiver的标识符访问receiver类型的字段。ToString方法通过访问struct字段返回客户名和电子邮件。
return fmt.Sprintf('Customer: %s %s, Email:%s', c.FirstName, c.LastName, c.Email )
清单3-9展示了一个示例程序,该程序声明了Customer struct,并向它添加了几个方法。
清单3 - 9:结构与方法
package main
import (
'fmt'
)
type Address struct {
Street, City, State, Zip string
IsShippingAddress bool
}
type Customer struct {
FirstName, LastName, Email, Phone string
Addresses []Address
}
func (c Customer) ToString() string {
return fmt.Sprintf('Customer: %s %s, Email:%s', c.FirstName, c.LastName, c.Email)
}
func (c Customer) ShippingAddress() string {
for _, v := range c.Addresses {
if v.IsShippingAddress == true {
return fmt.Sprintf('%s, %s, %s, Zip - %s', v.Street, v.City, v.State,
v.Zip)
}
}
return ''
}
func main() {
c := Customer{
FirstName: 'Alex',
LastName: 'John',
Email: 'alex@email.com',
Phone: '732-757-2923',
Addresses: []Address{
Address{
Street: '1 Mission Street',
City: 'San Francisco',
State: 'CA',
Zip: '94105',
IsShippingAddress: true,
},
Address{
Street: '49 Stevenson Street',
City: 'San Francisco',
State: 'CA',
Zip: '94105',
},
},
}
fmt.Println(c.ToString())
fmt.Println(c.ShippingAddress())
}
通过指定方法接收方,客户结构被附加到几个方法上。ToString返回客户名和电子邮件,ShippingAddress从存储在地址字段的地址列表中返回默认的送货地址。在主函数中,创建了Customer struct的一个实例,并调用了它的方法。
在运行程序时,您应该看到以下输出:
Customer: Alex John, Email:alex@email.com
1 Mission Street, San Francisco, CA, Zip - 94105
方法是带有接收器的函数。有两种方法接收器:指针接收器和值接收器。清单3-9中的程序使用一个值接收者为客户结构添加方法。当使用指针接收器指定一个方法时,该方法将使用一个指向接收器值的指针来调用,当该方法用一个值接收器指定时,将使用接收者值的副本。因此,如果想要改变接收方的状态(字段的值),必须使用一个指针接收器。
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[24014],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。