方法 method

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

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

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

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

  5. 不存在方法重载

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

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

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

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

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

package mainimport "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 mainimport "fmt"/**
Go到一个灵活到地方就是可以为type声明到任何类型绑定一个方法
例如下面到例子,定义了类型为整型到变量Va,为其绑定一个输出函数并在主方法中调用*/
type Va intfunc (a *Va) Print() {fmt.Println("Va")
}func main() {var a Vaa.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. Java核心技术笔记 语言基础

    <Java核心技术 卷Ⅰ> 第3章 Java 的基本程序设计结构 一些规则 类命名:CamelCase 驼峰命名法,以及必须是字母开头,后面跟字母和数字的任意组合: 源代码文件名:必须与公 ...

  3. c语言基础学python_D11——C语言基础学PYTHON

    C语言基础学习PYTHON--基础学习D11 20180908内容纲要: 1.RabbitMQ消息队列 (1)RabbitMQ安装 (2)Rabbits示例 模式一:fanout 模式二:direct ...

  4. R语言基础数据操作fBasics

    R语言基础数据操作&fBasics xlsx文件的导入 library(readxl) data1 <- read_excel("C:/Users/12241/Desktop/ ...

  5. Gradle | Gradle构建之Groovy语言基础

    前言 Gradle的构建脚本是采用Groovy语言编写的.Groovy是Java平台上设计的一种强大的.可选类型和动态的语言.Groovy可以无缝地集成任何Java程序,并立即让你的应用程序拥有强大的 ...

  6. Java回炉之语言基础

    Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...

  7. r语言各形状编号_190+张图片!吐血整理!搞定R语言基础绘图全部知识点

    转自:生信宝典|Bio_Data,不一样的生信学习平台 原文链接:ggplot2高效实用指南 (可视化脚本.工具.套路.配色) 作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语 ...

  8. R语言基础统计分析:正态性检验、方差齐性检验、T检验、方差分析、秩和检验

    R语言基础统计分析 1. 正态性检验 1.1 Shapiro-Wilk正态检验方法 1.2 QQ图 2. 方差齐性检验 2.1 Bartlett检验,适用于正态分布数据 2.2 Levene检验,非正 ...

  9. WML语言基础-WML语言基础(WAP建站)

    WML语言基础-WML语言基础(WAP建站)一 作者:青燕    来源:青燕网    更新时间:2007-8-19 19:22:22    浏览次数:255 完成wap服务器的建立和wap浏览器的安装 ...

最新文章

  1. Hinton 新作!越大的自监督模型,半监督学习需要的标签越少
  2. 338. Counting Bits
  3. 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型
  4. 未来的电子计算机作文500字,我的新计算机作文500字
  5. iOS imageio nsurlsession 渐进式图片下载
  6. 高效终端设备视觉系统开发与优化
  7. Codeforces Round #324 (Div. 2) B. Kolya and Tanya
  8. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
  9. 高效访问Internet-启用ISA Server的缓存
  10. win10电脑怎么升级安装win11正式版,电脑升级win11的方法
  11. 丛铭俣 160809324 (作业5)
  12. java解析marc乱码_国际C语言乱码大赛(IOCCC)的一个经典作品
  13. unity Animator做简单的人物动画
  14. 被炫龙DD3plus的insyde h20 bios整天了一整天分享分享解决问题经验
  15. Studio3T安装
  16. 利用服务器在家远程登录办公室电脑
  17. python爬取网页数据总结_python之爬取网页数据总结(一)
  18. python输入名字、输出_Python输入输出
  19. 2022年茶艺师(高级)考试题及模拟考试
  20. 利用TC进行流量控制

热门文章

  1. OpenGL Drawing Commands绘图命令的实例
  2. OpenGL波浪模拟
  3. C++骑士走棋盘Knight tour算法(附完整源码)
  4. QT的QDBusContext类的使用
  5. C语言数据类型本质分析
  6. 使用IntelliJ IDEA 配置Maven项目(入门)转:http://blog.csdn.net/qq_32588349/article/details/51461182
  7. nginx配置中proxy_redirect的作用(转)
  8. 处理时间_4_计算时间列所在的周的序号
  9. 移动时捕捉不到基点_CAD入门学习攻略:CAD软件中对象捕捉功能使用技巧汇总
  10. TensorRT(3)-C++ API使用:mnist手写体识别