方法 method

  1. Go 中虽没有 class,但依旧有 method

  2. 通过显示说明 receiver 来实现与某个类型的组合

  3. 只能为同一个包中的类型定义方法

  4. Receiver 可以是类型的值或者指针

  5. 不存在方法重载

  6. 可以使用值或指针来调用方法,编译器会自动完成转换

  7. 从某种意义上来说,方法是函数的语法糖,因为 receiver 其实就是方法所接收的第1个参数(Method Value vs. Method Expression)

  8. 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法

  9. 类型别名不会拥有底层类型所附带的方法

  10. 方法可以调用结构中的非公开字段

package main

import "fmt"

type A struct {
Name string
} type B struct {
Name string
} //引用传递得道到是指针到拷贝,修改会同步修改结构体内到内容
func (a *A) Print() {
a.Name = "AA"
fmt.Println("A")
} //值传递只是得到结构体内容到拷贝
func (b B) Print() {
b.Name = "BB"
fmt.Println("B")
} func main() {
a := A{}
a.Print()
fmt.Println(a.Name) b := B{}
b.Print()
fmt.Println(b.Name)
}

运行结果:

1
2
3
4
A
AA
B
<空字符串>

Go 还有一个特别灵活的地方,就是它可以为任何一个声明类型绑定定义一个方法,如下:

package main

import "fmt"

/**
Go到一个灵活到地方就是可以为type声明到任何类型绑定一个方法
例如下面到例子,定义了类型为整型到变量Va,为其绑定一个输出函数并在主方法中调用
*/
type Va int func (a *Va) Print() {
fmt.Println("Va")
} func main() {
var a Va
a.Print()
}

运行结果:

Va

说明:这里需要说明一点,结构体内部声明的变量首字母大小写是决定不同包之间的调用时公开的还是私有的,而在同一个包下,即使是小写的也是可以被调用到的。

  以上说了这么多,相信有很大一部分人觉得很乱,不一会函数不一会方法 method 的,感觉这两者都一样啊,那为什么还这么费劲的分开讲呢?这块对于初学者来说却是很容易混淆,简单的可以从以下两方面考虑:

  1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。

  2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。

  说人话就是:方法(method)与对象相关,函数(func)与对象无关,其实区别不大.有时需要面向对象思想时用方法名喽.method是绑定到了具体struct上了,而func就是简单的一个函数。

  还有不理解的?收到有的同学的提问,我就只好再啰嗦一句更加人话的人话:

    method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎 一样,只是在 func 后面增加了一个receiver(也就是method所依从的主体)。非得让我举例子吗,那好吧,我妥协了,看一下下面的例子吧:

// 定义了一个矩形结构体
type Rectangle struct {
width, height float64
} /*
  这里就是函数即func,其声明:
func funcName(parameters) (results)
*/
func area(r Rectangle) float64 {
return r.width*r.height
} /*
  这里就是方法即method,其声明:
func (r ReceiverType) funcName(parameters) (results)
*/
func (r Rectangle) area() float64 {
return r.width*r.height
}
 
 

GO语言基础之method的更多相关文章

  1. Go语言基础:method

    我们在C语言中,struct中声明函数,而Go中则不能再struct中声明函数.而是采用另外一种形态存在,Go中叫method. method的概念 method是附属在一个给定的类型上,语法和函数的 ...

  2. GO_07:GO语言基础之method

    方法 method 1. Go 中虽没有 class,但依旧有 method 2. 通过显示说明 receiver 来实现与某个类型的组合 3. 只能为同一个包中的类型定义方法 4. Receiver ...

  3. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  4. (cljs/run-at (->JSVM :browser) "语言基础")

    前言  两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索.而近一两年来又刮起了函数式编程的风潮,恰逢有幸主理新项目的前端架构,于是引入Ramda. ...

  5. Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

  6. Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  7. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  8. D17——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D17 20181014内容纲要: 1.jQuery介绍 2.jQuery功能介绍 (1)jQuery的引入方式 (2)选择器 (3)筛选 (4)文本操作 (5) ...

  9. D14——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D14 20180919内容纲要: 1.html认识 2.常用标签 3.京东html 4.小结 5.练习(简易淘宝html) 1.html初识(HyperText ...

随机推荐

  1. Redis持久化——AOF

    一.是什么? AOF是以日志的形式来记录每个写操作,将Redis执行过的所有写操作记录下来(读操作不做记录),只许追加文件不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis ...

  2. sync 解释

    sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率.sync命令则 ...

  3. php删除非空目录代码实现

    <?php header("Content-type: text/html; charset=utf-8"); $dir='mydir'; function deldir($ ...

  4. SURF 特征匹配

    参考:http://www.cnblogs.com/ronny/p/4045979.html,博主对源码进行了分析,不过很多没看明白. 分为几个部分.积分图:借助积分图像,图像与高斯二阶微分模板的滤波 ...

  5. vuex 的使用

    用于多组件共享状态,如果不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的.确实是如此——如果应用够简单,您最好不要使用 Vuex.可使用简单Bus总线的方式来管理共享的数据详见(http:// ...

  6. C/C++有效对齐值的确定

    先来看看什么是对齐.现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...

  7. poj 2236 加点 然后判断某两点是否连通

    题目大意:给你N台电脑,从1-N.一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信.然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电 ...

  8. University Entrace Examination zoj1023

    学校招收学生   优先级按照:  分数  是否本地  志愿先后 相当于 女的开后宫 对gs进行略微修改 结束的条件为每个男的表白完所有女的 第二部分比较时    找出女的后宫里的吸引力最弱的男的比较 ...

  9. 使用IDEA搭建spring

    从前使用eclipse开发,集成jar包,现在使用maven来管理 一: 1.框架 2.pom 需要spring core与spring context. <?xml version=" ...

  10. Vue之双向绑定原理动手记

    Vue.js的核心功能有两个:一是响应式的数据绑定系统,二是组件系统.本文是通过学习他人的文章,从而理解了双向绑定原理,从而在自己理解的基础上,自己动手实现数据的双向绑定. 目前几种主流的mvc(vm ...