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" " ...
随机推荐
- java全套学习资料
1.背景 技术需要大家的共同努力,在这里我将平时学习过的觉得比较好的资料分享给大家; 当然,最好的学习就是输出,与大家分享,在分享的资料中有的是自己的总结,有的是分享来自互联网,如果有侵权请联系删除; ...
- MySQL字符集、information_schema元数据(八)
一.SQL字符集 它是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家的文字.标点符号.图形符号.数字等 常用的字符集有:utf8.utf8mb4.utf8mb3(8.0),现 ...
- PTA 根据后序中序遍历输出先序遍历
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果. 输入格式: 第一行给出正整数N(≤30),是树中结点的个数.随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果, ...
- C++小工具
1.Doxygen 从源代码生成文档.可以生成在线文档(HTML)和离线手册(以LATEX格式),还可以自动生成各种依赖关系图,继承关系图等.
- AcWing 38. 二叉树的镜像
习题地址 https://www.acwing.com/solution/acwing/content/2922/ 题目描述输入一个二叉树,将它变换为它的镜像. 样例 输入树: / \ / \ / \ ...
- c# HttpClient的HTTP/2支持
HTTP/2 是 HTTP 协议的主要修订版.HTTP/2 的一些显著功能是支持标头压缩和通过同一连接完全多路复用流.虽然 HTTP/2 保留了 HTTP 的语义(HTTP 标头.方法等),但它在数据 ...
- 【CSP-S膜你考】那23个路口
那23个路口 题面 故事的起源不加赘述,那23个路口. 单刀直入,我直接说题的意思. 蚊子和疯子在做一件事,就是他们要在茫茫的大街上找一个出发点,然后从出发点开始,经过上下左右23次拐弯,到达一个他们 ...
- mysql实现行转列功能
实现从图一转行成图二的功能: 图一: 图二: 建表语句: CREATE TABLE `t_user_score` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '主 ...
- Windows快速批量删除大量文件的命令
命令分别如下: rmdir [drive:]path [/S] [/Q] del [drive:]path [/S] [/Q] 其中rmdir 与rd命令相同. /S 表示除目录本身外,还将删除指定目 ...
- 动态的src路径怎么写
错误写法 <div class="icon--wrapper" @click="before"> <img class="icon- ...