Go语言中的方法(Method Sets)

Stella981
• 阅读 612

物以类聚,人以群分。事物必以类分,以形命名。开始一个个学习Go语言中有哪些数据类型,以及这些类型的特点。

Go语言中的方法是函数之外一个特别的概念。在Go语言的参考中说:

A type may have a method set associated with it (§Interface types, §Method declarations).

  1. The method set of an interface type is its interface.

  2. The method set of any other type T consists of all methods with receiver type T.

  3. The method set of the corresponding pointer type *T is the set of all methods with receiver *T or T (that is, it also contains the method set of T).

  4. Any other type has an empty method set.

  5. In a method set, each method must have a unique method name.

意即,可以为所有自己定义的数据类型定义和该类型相关的方法。在Go里面没有严格的对象的概念,却有方法的概念。两个特殊的地方是:
1. interface是一个抽象的数据类型,它本身就是一个方法集。
2. 要注意type *T和type T不一样。实践中发现区别只在于指针上,type *T的方法操作原数据,type T的方法操作原数据的一个拷贝。type *T和type T定义的方法能互相用,不能重名。
3. 所有方法必需有单独的名字,并且不能动态重载。要完成动态重载可以用interface。

下面这个例子给自定义的浮点数建立Abs()方法:

package main  
 
import (  
      "fmt"  
      "math"  
)  
 
type MyFloat float64  
 
func (f MyFloat) Abs() float64 {  
      if f  <  0 {  
          return float64(  -f)  
    }  
      return float64(f)  
}  
 
func main() {  
    f  :  = MyFloat(  -math.Sqrt2)  
    fmt.Println(f.Abs())  
}

下面这个例子给结构体和结构体指针定义两个方法:

package main  
 
import (  
      "fmt"  
      "math"  
)  
 
type Vertex1  struct {  
    X, Y float64  
}  
 
func (v Vertex1) Scale(f float64) {  
    v.X  = v.X  * f  
    v.Y  = v.Y  * f  
}  
 
func (v Vertex1) Abs() float64 {  
      return math.Sqrt(v.X  *v.X  + v.Y  *v.Y)  
}  
 
 //不能再定义方法(v *Vertex1) Abs() float64   
 
type Vertex2  struct {  
    X, Y float64  
}  
 
func (v  *Vertex2) Scale(f float64) {  
    v.X  = v.X  * f  
    v.Y  = v.Y  * f  
}  
 
func (v  *Vertex2) Abs() float64 {  
      return math.Sqrt(v.X  *v.X  + v.Y  *v.Y)  
}  
 
func main() {  
    v1  :  = Vertex1{  3,  4}  
    v1.Scale(  5)  
    fmt.Println(v1, v1.Abs())  
 
    pv1  :  =  &Vertex1{  3,  4}  
    pv1.Scale(  5)  
    fmt.Println(pv1, pv1.Abs())  
 
    v2  :  = Vertex2{  3,  4}  
    v2.Scale(  5)  
    fmt.Println(v2, v2.Abs())  
 
    pv2  :  =  &Vertex2{  3,  4}  
    pv2.Scale(  5)  
    fmt.Println(pv2, pv2.Abs())  
}  
 /*
  will out put:
  {3, 4} 5
  &{3, 4} 5
  {15, 20} 25
  &{15, 20} 25
*/

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
九路 九路
3年前
一篇文章彻底弄懂go语言方法的本质
Go语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但Go语言也有方法(method)。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。而receiver参数正是方法与类型之间的纽带。Go方法的一般声明形式如下:gofunc(receiverT/T)MethodName(参数列表)
九路 九路
3年前
一篇文章彻底弄懂理解和高效运用切片(slice)
slice,中文多译为“切片”,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。1.切片究竟是什么在对切片一探究竟之前,我们先来简略了解一下Go语言中的数组。Go语言数组是一个固定长度的、容纳同构类型元素的
go语言中,数组与切片的区别?
切片是Go语言核心的数据结构,然而刚接触Go的程序员经常在切片的工作方式和行为表现上被绊倒。比如,明明说切片是引用类型但在函数内对其做的更改有时候却保留不下来,有时候却可以。究其原因是因为我们很多人用其他语言的思维来尝试猜测Go语言中切片的行为,切片这个内置类型在Go语言底层有其单独的类型定义,而不是我们通常理解的其他语言中数组的概念。文章
Wesley13 Wesley13
2年前
Go 定长的数组
1.Go语言数组的简介  几乎所有的计算机语言都有数组,应用非常的广泛。同样,在Go语言中也有数组并且在数组的基础上还衍生出了切片(slice)。数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素,一个数组包含的元素个数被称为数组的长度,这是数组的基本定义。  在Go语言中数组是一个值类型(ValueType)
Stella981 Stella981
2年前
Go 用 interface 模拟多态
多态是C这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在Go语言中没有类的概念,但仍然可以使用structinterface来模拟实现类的功能。下面这个例子演示如何使用Go来模拟C中的多态行为。packagemainimport"fmt"//首先定义了一
Wesley13 Wesley13
2年前
Go 函数方法
   在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如PHP函数就是方法,方法就是函数,但在Go语言中,函数是不属于任何结构体、类型的方法,也就是说函数是没有接收者的;而方法是有接收者的,我们所说的方法要么属于一个结构体的,要么属于一个新定义的类型的函数函数和方法,虽然概念不同,但是定义非常相似
小万哥 小万哥
4个月前
Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
学习基础知识掌握Go语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解Go基础知识的好起点是查阅Go官方文档文章链接:基本语法了解Go语言的基本语法,包括Go程序的执行方式、包引入、主函数等Go中的变量变量是赋予内存位置的名称,用于存储特
灵吉菩萨 灵吉菩萨
1个月前
马哥教育-Go语言开发学什么
在马哥教育的Go语言开发课程中,你可以学到以下内容:Go语言基础知识:学习Go语言的基本语法、数据类型、控制流程和函数等基础知识。download;kuxueit.cn/8629/并发编程:深入学习并发编程的概念和原理,了解Go语言独特的并发模型和goro
乐和 乐和
1个月前
马哥教育-Go语言开发|2023年第12期
马哥教育Go语言开发|2023年第12期download》chaoxingit.com/4521/Go语言开发的相关问题和回答当涉及到Go语言开发时,以下是一些常见问题及其回答:问题1:Go语言是什么?为什么选择使用Go语言?回答:Go语言是一门开源编程语