go方法集

server/2024/10/21 20:41:28/

方法集

Golang方法集 :每个类型都有与之关联的方法集,这会影响到接口实现规则。

    • 类型 T 方法集包含全部 receiver T 方法。• 类型 *T 方法集包含全部 receiver T + *T 方法。• 如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。 • 如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。 • 不管嵌入 T 或 *T,*S 方法集总是包含 T + *T 方法。

用实例 value 和 pointer 调用方法 (含匿名字段) 不受方法集约束,编译器总是查找全部方法,并自动转换 receiver 实参。

Go 语言中内部类型方法集提升的规则:

类型 T 方法集包含全部 receiver T 方法。

package mainimport ("fmt"
)type T struct {int
}func (t T) test() {fmt.Println("类型 T 方法集包含全部 receiver T 方法。")
}func main() {t1 := T{1}fmt.Printf("t1 is : %v\n", t1)t1.test()
}

输出结果:

    t1 is : {1}类型 T 方法集包含全部 receiver T 方法。

类型 *T 方法集包含全部 receiver T + *T 方法。

package mainimport ("fmt"
)type T struct {int
}func (t T) testT() {fmt.Println("类型 *T 方法集包含全部 receiver T 方法。")
}func (t *T) testP() {fmt.Println("类型 *T 方法集包含全部 receiver *T 方法。")
}func main() {t1 := T{1}t2 := &t1fmt.Printf("t2 is : %v\n", t2)t2.testT()t2.testP()
}

输出结果:

    t2 is : &{1}类型 *T 方法集包含全部 receiver T 方法。类型 *T 方法集包含全部 receiver *T 方法。

给定一个结构体类型 S 和一个命名为 T 的类型,方法提升像下面规定的这样被包含在结构体方法集中:

如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。

这条规则说的是当我们嵌入一个类型,嵌入类型的接受者为值类型的方法将被提升,可以被外部类型的值和指针调用。

package mainimport ("fmt"
)type S struct {T
}type T struct {int
}func (t T) testT() {fmt.Println("如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。")
}func main() {s1 := S{T{1}}s2 := &s1fmt.Printf("s1 is : %v\n", s1)s1.testT()fmt.Printf("s2 is : %v\n", s2)s2.testT()
}

输出结果:

    s1 is : {{1}}如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。s2 is : &{{1}}如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。

如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。

这条规则说的是当我们嵌入一个类型的指针,嵌入类型的接受者为值类型或指针类型的方法将被提升,可以被外部类型的值或者指针调用。

package mainimport ("fmt"
)type S struct {T
}type T struct {int
}func (t T) testT() {fmt.Println("如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法")
}
func (t *T) testP() {fmt.Println("如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法")
}func main() {s1 := S{T{1}}s2 := &s1fmt.Printf("s1 is : %v\n", s1)s1.testT()s1.testP()fmt.Printf("s2 is : %v\n", s2)s2.testT()s2.testP()
}

输出结果:

    s1 is : {{1}}如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法s2 is : &{{1}}如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T 方法如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 *T 方法


http://www.ppmy.cn/server/39274.html

相关文章

使用 backtrace 调测 SIGSEGV 信号 ---- 打印寄存器值

#define _GNU_SOURCE #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <execinfo.h> #include <ucontext.h> /* * backtrace和bacetrace_symbols打印出回溯信息 */ #if 0 #include <e…

学习javascript,实现一个简易售卖机的功能

有同学提问&#xff0c;说想实现一个JS售卖机的功能&#xff0c;我觉得这个挺有意思的&#xff0c;正是初学者学习JS&#xff0c;锻炼软件开发思维的一个好题目&#xff0c;所以就实现了一下&#xff0c;希望可以有帮助。 目录 1 需求分析 2 开发实现 2.1 商家端录入 2.2…

全面了解俄罗斯的VK开户和Yandex投放及内容运营

俄罗斯的VKontakte&#xff08;简称VK&#xff09;和Yandex是两个重要的在线平台&#xff0c;对于希望在俄罗斯市场进行推广的企业来说&#xff0c;了解如何在这些平台上开户和投放广告以及内容运营是非常关键的。 俄罗斯vk广告如何开户&#xff1f; 通过上海上弦进行俄罗斯V…

智能量化交易系统开发自动炒币机器人系统开发原理解析

Q&#xff1a;什么是量化交易&#xff1f;数字资产量化交易第三方辅助软件。其具备以下三个特点:1、资产安全资产在用户自己的交易所账户&#xff0c;软件只能通过API帮用户下单。2、操作简单用户只需要选择自己喜欢的操作风格&#xff0c;即可启动量化&#xff0c;通过API接口…

如何更好地导入Scrum?

前面写了一系列极限编程的分享&#xff0c;目前这系列先告一段落&#xff0c;后面等我们禅道20系列版本重构完再和大家分享TDD方面的经验体会。极限编程聊完了&#xff0c;接下来和大家聊聊Scrum。Scrum市面上相关的书籍、视频和分享比极限编程要多很多&#xff0c;我不做赘述。…

这是一关于DSC相关的文档

这是一关于DSC相关的文档 上面这幅图清晰的展示了somewhat flat的像素图示

校友录系统的设计与开发

**中文摘要&#xff1a;**随着互联网技术的不断发展和普及&#xff0c;人们对于信息化、数字化的需求也越来越高。在此背景下&#xff0c;校友录系统的设计与开发显得尤为重要。本文旨在设计和开发一款方便实用的校友录系统&#xff0c;为学校提供一个联系和管理校友的平台&…

如何用爬虫解决问题

一、介绍 爬虫指的是一种自动访问互联网上网页的程序,通过自动化的方式获取网页上的数据并进行处理。它可以从互联网的各个网站上抓取信息,如新闻、商品信息、图片等,并将这些数据存储或用于其他用途,如数据分析、搜索引擎索引等。爬虫可以模拟人的行为,通过访问网页上的…