golang学习笔记--函数和方法
在go中,函数类型是一等类型,这意味着可以吧函数当做一个值来传递和使用。
func divide(dividend int,divisor int)(int,error){
//省略部分代码
}
参数列表中的参数必须有名称,结果列表中结果的名称可有可无(要么都省略名称,要么都有名称)。
func divide(dividend int,divisor int)(result int, err error){
//省略部分代码
}
函数体中每个条件分支的最后一般都要有return语句,“return 返回值” , 若函数声明的结果是有具体名字的,那么return关键字后面就不用追加任何东西了, “return”
func divide(dividend int,divisor int)(result int, err error){
if divisor ==0{
err = erros.New("division by zero")
return
}
result = dividend / divisor
return
}
完整实例
package main import (
"errors"
"fmt"
) func divide(dividend int, divisor int) (result int, err error) {
if divisor == 0 {
err = errors.New("division by zero") return
}
result = dividend / divisor
return
}
func main() {
re, err := divide(5, 3)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(re)
}
}
函数的零值是nil, 检查外来函数值是否非nil总是有必要的。
方法是函数的一种,它实际上就是与某个数据类型关联在一起的函数。 示例如下
package main import (
"fmt"
) type myInt int func (i myInt) add(another int) myInt {
i = i + myInt(another)
return i }
func main() {
i1 := myInt(1)
i2 := i1.add(2)
fmt.Println(i1, i2)
}
从声明上看,方法只是在关键字func和函数名之间,加了一个由圆括号包裹的接收者声明。
接收者声明由两个部分组成
1)右边:表明了这份方法与哪个类型关联,这里是myInt;
2)左边:指定这个类型的值在当前方法中的标识符,这里是i, 这个标识符在当前方法中可以看做一个变量的代表,就像参数那样,可称为接收者变量。
注意:这个函数输出值是1 3
i的值未改变,是因为在值方法中对接收者变量的赋值一般不会影响到源值。i1的值就是源值。在调用i1的add方法时,这个值被赋给了接收者变量i(前者的副本与后者产生关联),但是,i和i1是两个变量,它们并不存在关联。
值方法的接收者类型是非指针的数据类型。相对应的是指针方法。它的接收者类型是某个数据类型的指针类型。
package main import (
"fmt"
) type myInt int func (i *myInt) add(another int) myInt {
*i = *i + myInt(another)
return *i }
func main() {
i1 := myInt(1)
i2 := i1.add(2)
fmt.Println(i1, i2)
}
执行结果 3 3
值方法和指针方法遵循如下规则:
接收者变量代表的值实际上是源值的一个复制品。如果这个值不是指针类型的,那么值方法中自然就没有途径去修改源值。
而指针值与其复制值指向的肯定是同一个值,所以在指针方法中就存在了改变源值的途径。
这里有一个例外,那就是如果接收者类型是某个引用类型或它的别名类型,那么即使是值方法,也可以改变源值。
对于某个非指针的数据类型,与它关联的方法的集合中只包含了它的值方法。
而对于它的指针类型,其方法集合中即包含值方法也包含指针方法,不过,在非指针数据类型的值上,也是能够调用其指针方法的。这是因为在go的内部做了自动转换
例如,若add方法是指针方法,那么表达式i1.add(2)会被自动转换为(&i1).add(2)
golang学习笔记--函数和方法的更多相关文章
- golang学习笔记---函数、方法和接口
函数:对应操作序列,是程序的基本组成元素. 函数有具名和匿名之分:具名函数一般对应于包级的函数,是匿名函数的一种特例,当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心 ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- golang学习笔记7 使用beego swagger 实现API自动化文档
golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- golang学习笔记14 golang substring 截取字符串
golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...
- golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web
golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
随机推荐
- group by 两个字段
group by 的简单说明: group by 一般和聚合函数一起使用才有意义,比如 count sum avg等 使用group by的两个要素: (1) 出现在select后面的字段 要么 ...
- Python基础(三)--流程控制之if、while、for,break与continue
一.流程控制之if……else…… if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一 if 条件1: 缩进的代码块 elif 条件2: 缩进的代码 ...
- Kafka Manager几个指标含义
记忆早退 Brokers Spread:看作broker使用率,如kafka集群9个broker,某topic有7个partition,则broker spread: 7 / 9 = 77% Brok ...
- ansible自动化运维02
ansible清单管理 inventory文件通常用于定义要管理主机的认证信息,例如:ssh登录用户名,密码,以及key相关信息. 举个例子:定义清单组 注意:组名为pro,关键字段children表 ...
- Nginx 高级配置-https 功能
Nginx 高级配置-https 功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTTPS工作过程 1>.SSL/TLS SSL(Secure Socket Lay ...
- 三、python对字符串和集合的内存垃圾回收机制
变量声明: name1 = "andy" name2 = name1 这个时候我把name1的值给改成了“tom”,问现在name2的值是什么?为什么? 答:andy,因为你把 ...
- 团队第五次——Alpha2的发布
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...
- @TableField
@TableField 描述:字段注解(非主键) 属性 类型 必须指定 默认值 描述 value String 否 "" 字段名 el String 否 "" ...
- 201871010134-周英杰《面向对象程序设计(Java)》第四周学习总结
201871010134-周英杰<面向对象程序设计(Java)>第四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- 10-赵志勇机器学习-meanshift
(草稿) meanshift 也是一种聚类方法. 优点在于:不需要提前指定类型数. 缺点就是计算量大 过程:(最一般的做法,没有使用核函数) 1. 逐点迭代,设置为位置中心 2. 计算所有点到位置中心 ...