Go语言中的方法(Method Sets)

物以类聚,人以群分。事物必以类分,以形命名。开始一个个学习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
*/

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章彻底弄懂go语言方法的本质

Go语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但Go语言也有方法(method)。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。而receiver参数正是方法与类型之间的纽带。Go方法的一般声明形式如下:gofunc(receiverT/T)MethodName(参数列表)

一篇文章彻底弄懂理解和高效运用切片(slice)

slice,中文多译为“切片”,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。1.切片究竟是什么在对切片一探究竟之前,我们先来简略了解一下Go语言中的数组。Go语言数组是一个固定长度的、容纳同构类型元素的

Go 用 interface 模拟多态

多态是C这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在Go语言中没有类的概念,但仍然可以使用structinterface来模拟实现类的功能。下面这个例子演示如何使用Go来模拟C中的多态行为。packagemainimport"fmt"//首先定义了一