go在方法中修改结构体的值_[Go]结构体及其方法

结构体类型可以包含若干字段,每个字段通常都需要有确切的名字和类型。也可以不包含任何字段,这样并不是没有意义的,因为还可以为这些类型关联上一些方法,这里可以把方法看作事函数的特殊版本。

函数事独立的程序实体,可以声明有名字的函数,也可以声明没名字的函数,还可以把它们当作普通的值传来传去(把具有相同签名的函数抽象陈独立的函数类型,作为一组输入或输出的代表)。方法则不同,它需要名字,不能被当作值来看待,更重要的是,它必须隶属于某一个类型。方法所属的类型会通过期声明中的接收者声明(关键字func和方法名称之间那个圆括号包裹起来的内容,其中必须包含确切的名称和类型字面量,这个接收者的类型其实就是当前方法所属的那个类型,而接收者的名称则用于在当前方法中引用它所属的类型的当前值)体现出来。

type AnimalCategory struct{

kingdomstring //界。

phylum string //门。

class string //纲。

order string //目。

family string //科。

genus string //属。

species string //种。

}

func (ac AnimalCategory) String()string{return fmt.Sprintf("%s%s%s%s%s%s%s",

ac.kingdom, ac.phylum, ac.class, ac.order,

ac.family, ac.genus, ac.species)

}

从String方法的接收者声明可以看出,它隶属于AnimalCategory类型。通过该方法的接收者名称ac,可以在其中引用到当前的任何一个字段或者调用到当前值的任何一个方法(包括string方法自己)。使用时可以这样表示

category := AnimalCategory{species: "cat"}

fmt.Printf("The animal category: %s\n", category)

在Go语言中,可以通过为一个类型编写名为String的方法,来自定义该类型的字符串表示形式,这个String方法不需要任何参数声明,但需要一个string类型的结果声明。正因为如此,在调用fmt.Print函数时,无需显式调用它的string方法,fmt.Print会自己去寻找它。

方法隶属的类型并不局限于结构图,但必须时某个自定义的数据类型,并且不能时任何接口类型。一个数据类型关联的所有方法,共同组成了该类型的方法集合。同一个方法集合中的方法不能出现重名,并且如果它们所属的是一个结构图类型,那么它们的名称与该类型中任何字段的名称也不能重复。

可以把结构体类型中的一个字段看作是它的一个属性或一项数据,再把隶属于它的一个方法看作是附加再其中数据之上的一个能力或一项操作。将属性及其能力封装再一起,是面向对象编程的一个主要原则。

1、结构体嵌入字段

Go语言规范规定,如果一个字段的声明中只有字段的类型名而没有字段的名称,那么它就是一个嵌入字段。可以通过此类型变量的名称后跟“.”,再后跟嵌入字段类型的方法引用到该字段。

type Animal struct{

scientificNamestring //学名。

AnimalCategory //动物基本分类。

}

func (a Animal) Category()string{returna.AnimalCategory.String()

}

Category方法的接收者类型是Animal,接收者名称是a。在该方法中,通过表达式a.AnimalCategory选择到了a这个嵌入字段,然后又选择了该字段的String方法并调用了它。

把一个结构体类型嵌入到另一个结构体中的,嵌入字段的方法集合会被无条件地合并进被嵌入类型地方法集合中。

animal :=Animal{

scientificName:"American Shorthair",

AnimalCategory: category,

}

fmt.Printf("The animal: %s\n", animal)

这里声明了Animal类型地变量animal并对它进行初始化,把字符串值“American Shorthair”赋值给它的字段scientificName,并把前面声明过的变量category赋给它的嵌入字段AnimalCategory

那再后面使用fmt.Printf函数相当于调用animal的String方法(虽然还没有为Animal类型编写String方法,但这样做并没有问题,因为嵌入字段AnimalCategory的String方法会被当做animal的方法调用)

那如果为Animal类型也编写一个String方法呢?会调用哪一个?

答案是animal的String方法会被调用,AnimalCategory的String方法被屏蔽掉了。注意:只要名称相同,无论这两个方法的签名是否一致,被嵌入类型的方法都会屏蔽掉嵌入字段的同名方法。

同样,如果两个结构体类型中存在同名的字段,那嵌入字段中的那个字段一定会被“屏蔽‘。即使是两个同名的成员,一个是字段,一个是方法,这种屏蔽现象依然会存在。

不过,即使被屏蔽了仍然可以通过链式的选择表达式,选择到嵌入字段的字段或方法。

当出现多层嵌入时,屏蔽现象会以嵌入的层级为依据,嵌入层级越深的字段或方法越可能被屏蔽。如果同一层级的多个嵌入字段拥有同名的字段或方法,那么被嵌入类型的值那里,选择此名称的时候就会引发一个编译错误。

2、Go语言用嵌入字段实现了继承吗?

Go语言中根本没有继承的概念

它所做的事通过嵌入字段的方式实现了类型之间的组合。

面向对象编程中的继承事通过牺牲一定的代码简洁性来换取可扩展性,这种可扩展性事通过侵入的方式实现的。

而类型之间的组合采用的是非声明的方式。不需要显式声明,而且也非侵入式的。只是通过嵌入字段的方式把一个类型的属性和能力嫁接给另外一个类型

3、值方法和指针方法都是什么意思?有什么区别

方法的接收者必须是某个自定义的数据类型,而且不能是接口类型或接口的指针类型。

值方法就是接收者是非指针的自定义数据类型的方法。前面的AnimalCategory、Animal声明的那些方法都是值方法。

type Cat struct{

namestringAnimal

}

func (cat*Cat) SetName(name string) {

cat.name=name

}

方法SetName的接收者类型是*Cat(Cat类型的指针类型)。那指针方法,就是接收者类型是指针类型的方法

区别:

1)值方法的接收者是该方法所属的那个类型值的一个副本,在该方法内对该副本的修改一般不不会体现在原值上(除非这个类型本身是某个引用类型(如切片或字典)的别名类型)。

指针方法的接收者,是该方法所属那个基本类型值的指针值的一个副本,这样的方法内对该副本指向值的进行修改,一定会体现在原值上。

(2)一个自定义数据类型的方法集合中仅会包含它的所有值方法

而该类型的指针类型的方法集合却包含了所有值方法和所有指针方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

to_number用法示例_Number()函数以及JavaScript中的示例

to_number用法示例Number()函数 (Number() function) Number() function is a predefined global function in JavaScript, it used to convert an object to the number. If the function is not able to convert the object in a number – it returns "NaN". (Rea…

系统延时任务及定时任务

1. 系统延时任务&#xff1a; at相关命令 at time 设定任务执行时间at> rm -fr /mnt/* 任务动作at> <EOT> <<ctrld 执行任务at的命令&#xff1a; -l ##查看任务列表-c …

cpn tools查看运行时间_Jmeter在Linux下的运行测试

一、JMeterApache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。1.1、JMeter的作用能够对HTTP和FTP服务器进行压力和性能测试&#xff0c; 也可以对任何数据库进行同样…

css div滚动_如何使用CSS创建可垂直滚动的div?

css div滚动Introduction: 介绍&#xff1a; Dealing with divs has become a regularity and divs are used for many purposes like to structure our code and to segregate our various sections of codes. Besides, we are also aware of many properties that we can im…

Linux中磁盘分区的管理

1. 本地存储设备的识别 fdisk -l真实存在的设备cat /proc/partitions系统识别的设备blkid系统可使用的设备df系统正在挂载的设备 真实存在的设备不一定可识别&#xff0c;识别到的的设备不一定可使用 2. 设备的挂载和卸载 1&#xff09;设备名称 /dev/xdx …

python中时间的加减_python日期加减

python中关于时间和日期函数的常用计算总结 python中关于时间和日期函数有time和datatime 1.获取当前时间的两种方法: import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") print now now = datetime.datetime.now()... 文章 技术小胖子 2017-11-08 848…

bst 删除节点_在BST中删除大于或等于k的节点

bst 删除节点Problem statement: 问题陈述&#xff1a; Given a BST and a value x, write a function to delete the nodes having values greater than or equal to x. The function will return the modified root. 给定一个BST和一个值x &#xff0c;编写一个函数删除值大…

游戏架构之二(转)

棋牌类游戏常用架构&#xff1a; 我从事过4年的棋牌类游戏开发&#xff0c;使用过的架构大致如上&#xff0c;各模块解释如下。 LoginServer&#xff1a; 登陆服务器&#xff0c;主要负责player 的登陆请求&#xff0c;验证player的合法性&#xff0c;为合法的player分配sessio…

对lvm介绍

1. 什么是LVM LVM是 Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;用户在无需停机的情况下可以方便地调整各个分区大小。 lvm中的一些常见符号及意义 pv物理卷被lv命令处理过的物理分…

pythonweb自动化测试实例_[转载]python webdriver自动化测试实例

python webdriver自动化测试初步印象以下示例演示启动firefox&#xff0c;浏览google.com,搜索Cheese&#xff0c;等待搜索结果&#xff0c;然后打印出搜索结果页的标题from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.w…

repeated_Ruby中带有示例的Array.repeated_combination()方法

repeatedArray.repeated_combination()方法 (Array.repeated_combination() Method) In this article, we will study about Array.repeated_combination() method. You all must be thinking the method must be doing something which is related to creating combinations o…

ApacheHttpServer修改httpd.conf配置文件

转自&#xff1a;https://blog.csdn.net/dream1120757048/article/details/77427351 1. 安装完 Apache HTTP Server 之后&#xff0c;还需要修改一下配置文件。 Apache 的配置文件路径如下&#xff1a; C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf…

大学物理实验电学基本参数的测量实验报告_大学物理电学实验报告

技校网专门为您推荐的类似问题答案问题1&#xff1a;怎样写大学计算机基础有关制作个人简历的实验报告一、实验名称&#xff1a;个人简历的制作 二、实验目的与要求: 1、熟悉Word 2003的基本操作 2、掌握利用网络搜索获得个人简历所需的资料 3、培养同学们动手能力和自学能力。…

python 线程模块_Python线程模块| main_thread()方法与示例

python 线程模块Python threading.main_thread()方法 (Python threading.main_thread() Method) main_thread() is an inbuilt method of the threading module in Python. It is used to return the main Thread object. It is the thread from which the Python interpreter …

linux中系统修复

1. 引导文件丢失 &#xff08;1&#xff09;引导文件所在路径 /boot/grub2/grub.cfg 需提前知道根目录所在分区和内核版本 uname -r 查询内核版本命令 模拟问题 rm -fr /boot/grub2/grub.cfg 一不小心把这玩意儿给删了&#xff0c;还reboot了 完了以后机子开不了了就这情况 …

dw相对路径怎么改_密云ETL怎么收费

密云ETL怎么收费&#xff0c;派客动力&#xff0c;公司依托自有产品&#xff0c;整合行业资源&#xff0c;构建先进的数据管理解决方案&#xff0c;解决企业和组织的核心数据问题以及被影响的业务挑战。这种工具我都使用过&#xff0c;优点有&#xff1a;图形界面&#xff0c;开…

python 自动化之路 day 08_2 网络编程

本节内容 Socket介绍Socket参数介绍基本Socket实例Socket实现多连接处理通过Socket实现简单SSH通过Socket实现文件传送作业&#xff1a;开发一个支持多用户在线的FTP程序1. Socket介绍 概念 A network socket is an endpoint of a connection across a computer network. Today…

查看scala变量数据类型_Scala文字,变量和数据类型| Scala编程教程

查看scala变量数据类型1)Scala数据类型 (1) Scala Data Types) Scala has the same set of data types as in Java. The traditional 14 data types are inherited as it is in Scala. Scala具有与Java中相同的数据类型集。 传统的14种数据类型在Scala中被继承。 The Followin…

Elasticsearch过滤与聚合的先后顺序java实现

2019独角兽企业重金招聘Python工程师标准>>> 一、Elasticsearch的聚合 ES的聚合相当于关系型数据库里面的group by&#xff0c;例如查找在性别字段男女人数的多少并且按照人数的多少进行排序&#xff0c;在使用MySQL的时候&#xff0c;可以使用如下的句子 select se…

js手机号中间四位_11位手机号码隐藏中间四位数,学会Substitute函数一键搞定!...

相信许多朋友都有见过手机号码被*号隐藏中间四位数的情况。许多地方为了保护个人信息&#xff0c;都会将手机号的中间四位数用星号代替。如上图所示&#xff0c;我们需要将原来的手机号码&#xff0c;通过*号的方式变为隐藏后的加密模式。下面我们就来学习一下如何利用substitu…