Go语言中的方法(Method Sets)

Stella981
• 阅读 807

物以类聚,人以群分。事物必以类分,以形命名。开始一个个学习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
3年前
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
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
九路 九路
3年前
一篇文章彻底弄懂go语言方法的本质
Go语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但Go语言也有方法(method)。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。而receiver参数正是方法与类型之间的纽带。Go方法的一般声明形式如下:gofunc(receiverT/T)MethodName(参数列表)
九路 九路
3年前
一篇文章彻底弄懂理解和高效运用切片(slice)
slice,中文多译为“切片”,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。1.切片究竟是什么在对切片一探究竟之前,我们先来简略了解一下Go语言中的数组。Go语言数组是一个固定长度的、容纳同构类型元素的
Stella981 Stella981
3年前
Go 用 interface 模拟多态
多态是C这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在Go语言中没有类的概念,但仍然可以使用structinterface来模拟实现类的功能。下面这个例子演示如何使用Go来模拟C中的多态行为。packagemainimport"fmt"//首先定义了一
Wesley13 Wesley13
3年前
Go 函数方法
   在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如PHP函数就是方法,方法就是函数,但在Go语言中,函数是不属于任何结构体、类型的方法,也就是说函数是没有接收者的;而方法是有接收者的,我们所说的方法要么属于一个结构体的,要么属于一个新定义的类型的函数函数和方法,虽然概念不同,但是定义非常相似
小万哥 小万哥
11个月前
Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
学习基础知识掌握Go语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解Go基础知识的好起点是查阅Go官方文档文章链接:基本语法了解Go语言的基本语法,包括Go程序的执行方式、包引入、主函数等Go中的变量变量是赋予内存位置的名称,用于存储特
IT全栈视野 IT全栈视野
2个月前
Go开发者成长之路
在Go语言中,成长路径可以包括以下几个阶段:1.安装和配置Go环境:访问Go官网下载并安装Go语言。设置环境变量GOPATH和确保PATH包含Go二进制文件路径。2.学习基础语法:包括变量、函数、控制流、指针、结构体、数组、切片、映射等。3.学习并发编程: