专栏首页编程28.go语言没有类 却可以在结构体或任意类型定义方法

28.go语言没有类 却可以在结构体或任意类型定义方法

共2500字,阅读需6分钟

在go语言中没有类。可是,是有方法的。

给结构体定义方法,在对应的 func 和方法名之间,加上方法的接收者就可以了。

比如,我们定义了一个结构体

希望 Vertex 有一个 方法,就这样写

注意结构体的方法接收者是指针时,调用需要在前面加上 符号。

这样写有点冗长,在结构的方法有多个的时候,调用也不方便。你可以初始化一个变量,然后再调用。

完整代码看一下

这个示例输出的结果是 5

除了结构体,还可以对自己包中的任意类型,定义任意方法。(对来自其他包的类型或基础类型是不能定义方法的。)

比如,你可以创建一个类型

然后给这个 MyFloat 定义方法

完整示例

运行结果

上面两个例子中,分别实现了两个 。一个指针类型,一个值类型。

使用指针是为了避免在每个方法调用时都进行值拷贝(如果类型是大型结构体的话,会更有效率。);其次,指针方法可以修改接收者指向的值。

我们定义一个 Scale 方法,用指针做类型做接收者。会发现 Scale 之后,Vertex 的值发生了改变,并影响以后的运算结果。

运行结果是

之所以 Before 和 After 的结果不同,是因为 对 X 和 Y 做了修改,由于使用的是指针类型,所以事实上修改了 Vertex 结构体中 X 和 Y 的值。

然后 After 的输出 和 就和 Before 不同了。

在一些多个点共同对一个点享有修改权的场景中,指针类型很有用。

本文来自企鹅号 - Golang语言社区媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 混合云的四大典型应用案例

    在云计算的早期,业界的专家们就对公有云和私有云的优缺点进行了大量的讨论,以帮助企业做出更好的选择。 现在大多数企业已经不再需要从公有云或者私有云中作出选择,企业...

    企鹅号小编
  • 2018年云计算行业展望

    ----前言---- 五年前我偶然了解了云计算这个概念,然后我就把IT技术文章都删了,发了一篇关于云计算文章,文章中原文是“云计算会在短则五年、长则十年的时间里...

    企鹅号小编
  • Go语言中new和make的区别

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例...

    企鹅号小编
  • 《go in action》第5章(Go语言的类型系统)读书笔记

    两种不同类型的值即便相互兼容,也不能互相赋值。编译器不会对不同类型的值做隐式转换。

    跑马溜溜的球
  • int 和 Integer 有什么区别?

    int 是 java 的原始数据类型,Integer 是 java 为 int 提供的封装类。

    MickyInvQ
  • 第6章 类型系统

    6.3 基本类型(Primitive Types) 6.3.1 Number: 包含整型与浮点型等 6.3.2 Char: 字符类型(Character) ...

    一个会写诗的程序员
  • Go 语言编译过程概述

    Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解 Go ...

    李海彬
  • go 参数传递

    http://stor.51cto.com/art/201712/559955.htm go 中都是值传递的,即使是map、切片这些。 只不过类型分为:

    平凡的学生族
  • Go数据结构与算法之内置类型

    每一种编程语言都会内置几种基本的数据结构。例如:Python的List、Dict、Set等。基本数据类型可以大概分为两类:

    宇宙之一粟
  • Go语言实战笔记(七)| Go 类型

    Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

    飞雪无情

扫码关注云+社区

领取腾讯云代金券