Go的函数

一、函数的定义

函数要定义在main函数的外面,无所谓前后。

1、函数的基本格式

// 不带返回值的函数
func关键字 函数名(参数1 类型,参数2 类型,...){
函数体内容代码
} // 带一个返回值的函数
func关键字 函数名(参数1 类型,参数2 类型) 返回值类型 {
函数体内容代码
} // 带多个返回值的函数
func关键字 函数名(参数1 类型,参数2 类型) (返回值类型1,返回值类型2...) {
函数体内容代码
} func main() {
test(66)
}
func test(a int) {
fmt.Println(a)
}
func t3(a,b int) int {
return a+b
}

2、函数的参数

Go中函数的参数只有位置参数一种,没有关键字参数。

如果有参数的类型相同,可以省略多余的类型关键字。

func关键字 函数名(参数1,参数2 类型,。。。){
函数体内容代码
} func main() {
test(66,88)
t2(1,2,"ok")
} func test(a ,b int) { // a,b都是int
fmt.Println(a+b)
} // 154 func t2(a,b int,c string) { // a,b是int,c是string
fmt.Println(a+b,c)
} // 3 ok

2.1 函数传参的特点:copy传值

go语言中函数传参,都是copy传递。不管是值类型还是引用类型。都会copy一份,传进这个函数。

如果是值类型的变量,传进函数后被修改,则不会影响被copy的变量。因为已经是不同的变量了。

但如果是引用类型的变量,传进函数后被修改,是会影响到其他的引用这个地址的变量的。因为直接将这个地址的值修改了。

Python的不同之处:

Python参数传递统一使用的是引用传递方式。

但Python对象分为可变对象(list,dict,set等)和不可变对象(number,string,tuple等)。

当传递的参数是可变对象的引用时,因为可变对象的值可以修改,因此可以通过修改参数值而修改原对象。

当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,但是由于Python做了处理使不可变对象无法修改,所以参数的修改不会影响原对象,而是重新开辟了一块地址放这个值。

3、函数的返回值

需要指定返回值类型是什么。

声明位置在参数与函数代码块之间。

如果有多个返回值,需要用小括号将返回值类型包起来。

而且返回几个值,就必须用几个值来接收。不像Python可以用一个变量来接收多个返回值。

如果不想接收参数,可以用下划线顶替。但在go中,下划线真的就是不接收,不像Python,下划线也是一个变量。

func main() {
var r3 int = t3(1,2)
fmt.Println(r3) var r4,r5 int= t4(2,1)
fmt.Println(r4,r5)
} func t3(a,b int) int {
return a+b
} // 3 func t4(a,b int) (int,int) {
return a+b,a-b
} // 3 1

4、可变长参数

...可以用来接收任意长度的参数。相当于Python中的*

func main() {
t5(1,2,3,4,5,6,7)
} func t5(a ...int) {
fmt.Println(a)
} // [1 2 3 4 5 6 7] 生成一个切片

二、函数的类型

函数的类型包含函数的参数,返回值。

var a func()
var b func(a,b int)
var c func(a,b int)int
var d func(a,b int)(int,string)

1、给函数的类型重命名

语法:type 类型名称 函数类型

也可以给其他类型重命名。

func main() {
var s Myfunc = t8(1,2)
s(2)
} type Myfunc func(a int)int // func test(x,y int) func(z int)int {
func t8(x,y int) Myfunc {
//只是一个内层函数
a:= func(z int)int {
fmt.Println(x+y+z)
return x+y+z
}
return a
} >>>:5

三、匿名函数

1、匿名函数的定义

GO中,匿名函数只能定义在函数的内部。

func t6()  {
func () { // 匿名函数
fmt.Println("ok")
}()
}

2、匿名函数的执行

// 方法一、直接加括号执行
func main() {
t6()
} func t6() {
func () {
fmt.Println("ok")
}()
} // ok // 方法二、用变量接收
var a = func(a int) {
fmt.Println("匿名函数")
}
fmt.Printf("%T",a) // func(int)
a(1)

四、闭包函数

1、闭包的概念

  1. 定义在函数内部
  2. 对外部作用域有引用(引用外部变量)

2、闭包函数的定义

/* 这就不是闭包,因为没有引用外部变量
func test() func() {
//只是一个内层函数
a:= func() {
fmt.Printf("我是内层函数")
}
return a
}
*/ // 闭包函数:引用了外部的变量
func main() {
var s Myfunc = t8(1,2)
s(2) // 5
} type Myfunc func(a int)int // func test(x,y int) func(z int)int {
func t8(x,y int) Myfunc {
a:= func(z int)int {
fmt.Println(x+y+z)
return x+y+z
}
return a
}

Go的函数的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  10. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. 用鸿蒙开发AI应用(七)触摸屏控制LED

    [小年答谢,新春送礼]免费抽取1000元京东卡+更多新春好礼~查看详情>>> 目录:前言背景知识编译用户程序框架子系统基于AbilityKit开发的Ability总结 前言上一篇,我 ...

  2. Kwp2000协议的应用(程序原理篇)

    作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 总述     接上篇文章Kwp2000协议的应用(硬件原理使用篇),本篇针对kwp2000协议标准的服务ID详细介绍,以及针对程序实现 ...

  3. G - 跑跑卡丁车

    跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种加速卡,用这种加速卡可以在有限的时间里提高你的速度.为了使问题简单化,我们假设 ...

  4. CF 1400F x-prime Substrings 题解【AC自动机+DP】

    CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上 ...

  5. Codeforces Round #648 (Div. 2) A. Matrix Game

    题目链接:https://codeforces.com/contest/1365/problem/A 题意 给出一个 $n \times m$ 的网格,两人轮流选择一个所在行列没有 $1$ 的方块置为 ...

  6. P站风格的DevTools主题

    Chrome插件地址:https://chrome.google.com/webstore/detail/material-devtools-theme-c/jmefikbdhgocdjeejjnne ...

  7. 过滤器,拦截器,aop区别与使用场景

    1. 什么是过滤器 过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中 ...

  8. kafka——集群安裝部署(自带zookeeper)

    kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 一.kafka简介 kafka官网:http://kafka.apache.or ...

  9. Python_微信支付(云开发)

    一.创建云开发小程序 1.初始化云开发环境 //app.js App({ onLaunch: function () { wx.cloud.init({ //初始化云开发环境 env: 'wxypay ...

  10. Leetcode(18)-四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...