Go语言核心36讲笔记11--结构体及其方法的使用法门


1.函数与方法的区别

函数的定义声明中没有接收者,而在定义方法时会在func和方法名之间增加一个参数,这个参数就是接收者,这样就将方法和接收者绑定在一起了。此外方法隶属于类型。

package main

import "fmt"

func main() {
	fmt.Println(sum(1, 2))

	s := student{name: "Doris"}
	fmt.Println(s.String())
}

//函数
func sum(vals ...int) int {
	total := 0
	for _, val := range vals {
		total += val
	}
	return total
}

type student struct {
	name string
}
//方法
func (s student) String() string {
	return "the student's name is " + s.name
}

2.结构体类型中的某个字段声明只有一个类型名,那么该字段代表了什么?

如果一个字段的声明中只有字段的类型名而没有字段的名称,那么它就是一个嵌入字段,也可以称为匿名字段。我们可以通过此类型变量的名称后跟“.”,再后跟嵌入字段类型的方式引用到该字段。也就是说,嵌入字段的类型既是类型也是名称。

注意:当一个结构体中包含嵌入字段,在该结构体与嵌入字段包含相同的方法名称的情况下会发生“屏蔽现象”。此时可以通过链式的选择表达式选择嵌入字段的字段或者方法。此外,嵌入层级越深的字段或者方法越可能被屏蔽。如果处于同一个层级的多个嵌入字段拥有同名的字段或方法,那么从被嵌入类型的值那里选择此名称的时候就会引发一个编译错误,因为编译器无法确定被选择的成员到底是哪 一个。

3.Go语言是用嵌入字段实现继承吗?

Go 语言中根本没有继承的概念,它所做的是通过嵌入字段的方式实现了类型之间的组合。此外接口类型之间也可以组合。在 Go 语言中,接口类型之间的组合甚至更加常见,我们常常以此来扩展接口定义的行为或者标记接口的特征。

4.值方法与指针方法是什么意思,两者有何区别?

值方法,就是接收者类型是非指针的自定义数据类型的方法。指针方法则是接收者类型是指针的自定义数据类型的方法。两者不同具体如下:

  • 值方法的接收者是该方法所属的那个类型值的一个副本。在该方法内对该副本的修改一 般都不会体现在原值上,除非这个类型本身是某个引用类型(比如切片或字典)的别名类型。而指针方法的接收者,是该方法所属的那个基本类型值的指针值的一个副本。在这样的 方法内对该副本指向的值进行修改,却一定会体现在原值上。
  • 一个自定义数据类型的方法集合中仅会包含它的所有值方法,而该类型的指针类型的方法集合却囊括了前者的所有方法,包括所有值方法和所有指针方法。
  • 一个类型的方法集合中有哪些方法与它能实现哪些接口类型是息息相关的。如果一个基本类型和它的指针类型的方法集合是不同的,那么它们具体实现的接口类型的数量就也会有差异,除非这两个数量都是零。

5.思考题

1.我们可以在结构体类型中嵌入某个类型的指针类型吗?如果可以,有哪些注意事项?
答:可以,在初始化该结构体时需要初始化其嵌入的指针类型字段
2. 字面量struct{}代表了什么?又有什么用处?
答:字面量struct{}代表的是空结构体,在go语言中,空结构体类型是不占用系统内存的,并且所有该类型的变量都拥有相同的内存地址。因此被广泛作为各种场景下的占位符使用。一是节省资源,二是空结构体本身就具备很强的语义,即这里不需要任何值,仅作为占位符。

本节示例代码地址:demo GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值