Go通关05:函数和方法的不同之处!
时间:2021-08-04
本文章向大家介绍Go通关05:函数和方法的不同之处!,主要包括Go通关05:函数和方法的不同之处!使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
函数
函数声明
func funcName(params) result {
body
}
- 关键字 func 用于声明一个函数
- funcName 函数名
- params 函数的参数
- result 是函数的返回值,可以返回多个返回值,如果没有可以省略。
- body 函数体
示例
1.
- a、b形参类型一致,可以省略其中一个类型的声明
func sum (a, b int) {
return a + b
}
2.多值返回
- 返回值的部分类型定义需要小括号括起来。
func sum (a, b int) (int,error) {
if a <0 || b <0 {
return 0, errors.New("a或b不能是负数")
}
return a + b, nil
}
3.命名参数返回
- 函数中给命名返回参数赋值,相当于函数有了返回值,所以可以忽略 return 后要返回的值了。
func sum (a, b int) (sum int,err error) {
if a <0 || b <0 {
return 0, errors.New("a或b不能是负数")
}
sum = a + b
err = nil
return
}
4.可变参数
- 函数的参数是可变的
- 定义可变参数,只要在参数类型前加三个点 ... 即可
- 可变参数的类型其实就是切片,下面示例中 params 的参数类型是 []int
func sum(params ...int) int {
sum := 0
for _, i := range params {
sum += i
}
return sum
}
包级函数
- 函数都会从属于一个包,我们自定义的函数属于 main 包。Println 函数属于 fmt 包。
- 想要调用其他包内的函数,那么那个函数名称首字母要大写,使其作用域变为公有的。
- 函数首字母小写,只能在同一个包中被调用
匿名函数和闭包
匿名函数就是没有名称的函数。
func main(){
//注意,sum 只是一个函数类型的变量,不是函数名字
sum := func(a, b int) int {
return a + b
}
fmt.Println(sum(1, 2)) // 3
}
匿名函数可以在函数中进行嵌套,这个匿名函数称为内部函数,内部函数可以使用外部函数的变量,这种方式就是闭包。
func main (){
sm := sum()
fmt.Println(sum())
fmt.Println(sum())
fmt.Println(sum())
}
func sum () func() int{
i := 0
return func ()int{
i++
return i
}
}
//结果为:
1
2
3
由于闭包函数,sum 函数返回一个匿名函数,匿名函数持有外部函数 sum 的变量 i,所以在main函数中,每次调用 sum(),i的值就会 +1。
在 Go 语言中,函数也是一种类型,可以作为函数类型的变量、参数、或者一个函数的返回值。
方法
方法和函数类似,不同之处就是方法必须有一个接收者,这个接收者是一个“类”(类型),这样这个方法就算属于这个“类”。
type Name string
func (n Name)String(){
fmt.Println("name is ", n)
}
- 示例中 String() 就是 Name 这个类型的方法
- 接收者需要加在 func 和方法名之间,使用()
- 接收者: (变量,类型)
使用:
func main(){
name := Name("无尘")
name.String()
}
//出处
name is 无尘
值类型接收者、指针类型接收者
方法的接收者可以使用值类型(例如上面示例)或者指针类型。
如果接收者是指针,那么对指针的修改是有效的:
func (n *Name) Modify(){
*n = Name("wucs")
}
func main(){
name := Name("无尘")
name.String()
name.Modify()
name.String()
}
//输出
name is 无尘
name is wucs
注意:在调用方法时,传递的接收者实质上都是副本,只不过一个是值副本,一个是指向这个值的指针的副本。指针指向原有值,所以修改指针指向的值,也就修改了原有值。
方法的调用者,可以是值,也可以是指针((&name).Modify()),Go 语言会自动转义,我们无需关心。
方法表达式
方法可以赋值给变量
name := Name("无尘")
//方法赋值给变量,方法表达式
n = Name.String
//要传一个接收者name进行调用
n(name)
无论方法是否有参数,通过方法表达式调用,第一个参数必须是接收者,然后才是方法自身的参数。
原文地址:https://www.cnblogs.com/isungge/p/15098044.html
- Visual C#.Net网络程序开发-Tcp篇(1) 祥细内容:
- 无服务器化的微服务持续交付
- Visual C#.Net网络程序开发-Tcp篇(2) 祥细内容:
- 看你是否够老 – ipman的vxd程序介绍的翻译
- Visual C#.Net网络程序开发-Tcp篇(3) 祥细内容:
- 安全科普:流量劫持能有多大危害?
- OpenSSL心脏出血漏洞全回顾
- Nmap扫描对比工具–libnmap实践
- 如何使用TensorFlow实现神经网络
- 安全科普:详解流量劫持的形成原因
- Office”组合”式漏洞攻击样本分析
- jsp标签小结
- 专家解释“愤怒的小鸟”如何变身间谍
- BT5 + wireshark玩wifi捕获和中间人攻击
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【C语言简单说】十九:二维数组循环嵌套(2)
- 【C语言简单说】二十:指针基础
- 【C语言简单说】二十一:双重指针基础 (完结)
- 有关 php __autoload 自动加载类函数的用法
- sql 子查询(mysql)
- php 使用PDO,防止sql注入 简单说明
- js (javascript) 中获取年月日信息
- js(javascript)取得当前时间小时,分钟,秒 以及毫秒
- js(javascript) onclick与ondblclick 单击与双击事件
- unity5.x C# 获取屏幕宽度 设置不受重力影响
- unity5.x Translate平移移动 以及GetComponent获取组件
- php 计时器microtime 以及去掉数组重复值array_unique
- php 字符串打散为数组,用逗号分隔出数组
- php in_array 判断数组中是否存在此元素
- php str_replace 字符串替换