Go函数高级
1. 函数的数据类型
package main import "fmt" func main() {
/*
go语言的数据类型:
基本数据类型:
int,float,bool,string 复合数据类型:
array,slice,map,function,pointer,struct,interface。。。 函数的类型:
func(参数列表的数据类型)(返回值列表的数据类型) */ a := 10
fmt.Printf("%T\n", a) //int
b := [4]int{1, 2, 3, 4}
fmt.Printf("%T\n", b) //[4]int
/*
[4]string
[6]float64
*/
c := []int{1, 2, 3, 4}
fmt.Printf("%T\n", c) //[]int d := make(map[int]string)
fmt.Printf("%T\n", d) //map[int]string
/*
map[string]string
map[string]map[int]string
*/ fmt.Printf("%T\n", fun1) //func()
fmt.Printf("%T\n", fun2) //func(int) int
fmt.Printf("%T\n", fun3) //func(float64, int, int) (int, int)
fmt.Printf("%T\n", fun4) //func(string,string,int,int)(string,int ,float64)
} func fun1() {} func fun2(a int) int {
return 0
} func fun3(a float64, b, c int) (int, int) {
return 0, 0
} func fun4(a, b string, c, d int) (string, int, float64) {
return "", 0, 0
}
2. 函数的本质
package main import "fmt" func main() {
/*
Go语言的数据类型: 数值类型:整数,浮点
进行运算操作,加减乘除,打印
字符串:
可以获取单个字符,截取子串,遍历,strings包下的函数操作。。
数组,切片,map。。
存储数据,修改数据,获取数据,遍历数据。。。
函数:
加(),进行调用 注意点:
函数作为一种复合数据类型,可以看做是一种特殊的变量。
函数名():将函数进行调用,函数中的代码会全部执行,然后将return的结果返回给调用处
函数名:指向函数体的内存地址 */
//1.整型
a := 10
//运算:
a += 5
fmt.Println("a:",a) //a: 15
//2.数组,切片,map。。容器
b := [4]int{1,2,3,4}
b[0] =100
for i:=0;i<len(b);i++{
fmt.Printf("%d\t",b[i]) //100 2 3 4
}
fmt.Println() //3.函数做一个变量
fmt.Printf("%T\n",fun1) //func(int, int)
fmt.Println(fun1) //0x493310 看做函数名对应的函数体的地址 //4.直接定义一个函数类型的变量
var c func(int,int)
fmt.Println(c) //<nil> 空 //var d string
//d = "hello"
c = fun1 //将fun1的值(函数体的地址)赋值给c
fmt.Println(c) //0x493310 fun1(10,20) //a:10,b:20
c(100,200) //a:100,b:200 c也是函数类型的,加小括号也可以被调用 res1 := fun2 //将fun2的值(函数的地址)赋值给res1,res1和fun2指向同一个函数体
res2 := fun2(1,2) //将fun2函数进行调用,将函数的执行结果赋值给res2,相当于:a+b
fmt.Println(res1) //0x4932f0
fmt.Println(res2) //3 fmt.Println(res1(10,20))//30 也可以被调用
//res2() //cannot call non-function res2 (type int)
}
func fun2(a,b int)int{
return a + b
}
func fun1(a, b int){
fmt.Printf("a:%d,b:%d\n",a,b)
}
3. 匿名函数
package main import "fmt" func main() {
/*
匿名:没有名字
匿名函数:没有名字的函数。 定义一个匿名函数,直接进行调用。通常只能使用一次。也可以使用匿名函数赋值给某个函数变量,那么就可以调用多次了。 匿名函数:
Go语言是支持函数式编程:
1.将匿名函数作为另一个函数的参数,回调函数
2.将匿名函数作为另一个函数的返回值,可以形成闭包结构。
*/ fun1()
fun2 := fun1
fun2() //匿名函数
func() {
fmt.Println("我是一个匿名函数。。")
}() fun3 := func() {
fmt.Println("我也是一个匿名函数。。")
}
fun3() //定义带参数的匿名函数
func(a, b int) {
fmt.Println(a, b)
}(1, 2) //定义带返回值的匿名函数
res1 := func(a, b int) int {
return a + b
}(10, 20) //匿名函数调用了,将执行结果给res1
fmt.Println(res1) res2 := func(a, b int) int {
return a + b
} //将匿名函数的值,赋值给res2
fmt.Println(res2) fmt.Println(res2(100, 200))
} func fun1() {
fmt.Println("我是fun1()函数。。")
}
4. 高阶函数/回调函数
package main import "fmt" func main() {
/*
高阶函数:
根据go语言的数据类型的特点,可以将一个函数作为另一个函数的参数。 fun1(),fun2()
将fun1函数作为了fun2这个函数的参数。
fun2函数:就叫高阶函数
接收了一个函数作为参数的函数,高阶函数
fun1函数:回调函数
作为另一个函数的参数的函数,叫做回调函数。
*/
//设计一个函数,用于求两个整数的加减乘除运算
fmt.Printf("%T\n", add) //func(int, int) int
fmt.Printf("%T\n", oper) //func(int, int, func(int, int) int) int res1 := add(1, 2)
fmt.Println(res1) res2 := oper(10, 20, add)
fmt.Println(res2) res3 := oper(5,2,sub)
fmt.Println(res3) fun1:=func(a,b int)int{
return a * b
} res4:=oper(10,4,fun1)
fmt.Println(res4) res5 := oper(100,8,func(a,b int)int{
if b == 0{
fmt.Println("除数不能为零")
return 0
}
return a / b
})
fmt.Println(res5) } //fun func(int, int) int
//这是一个函数类型
//接收两个int类型的参数,返回值是int类型
func oper(a, b int, fun func(int, int) int) int {
fmt.Println(a, b, fun) //打印3个参数
res := fun(a, b)
return res
} //加法
func add(a, b int) int {
return a + b
} //减法
func sub(a, b int) int {
return a - b
}
5. 闭包
package main import "fmt" func main() {
/*
go语言支持函数式编程:
支持将一个函数作为另一个函数的参数,
也支持将一个函数作为另一个函数的返回值。 闭包(closure):
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或者外层函数中直接定义的变量),
并且该外层函数的返回值就是这个内层函数。 这个内层函数和外层函数的局部变量,统称为闭包结构。 局部变量的生命周期会发生改变,正常的局部变量随着函数调用而创建,随着函数的结束而销毁。
但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还要继续使用。 */
res1 := increment() //res1 = fun
fmt.Printf("%T\n", res1) //func() int
fmt.Println(res1) //0x493020 函数体的地址
v1 := res1()
fmt.Println(v1) //1
v2 := res1()
fmt.Println(v2) //2
fmt.Println(res1()) //3 } //因为闭包外层函数要返回内层函数
//func() int 就是内层函数的数据类型
func increment() func() int { //外层函数
//1.定义了一个局部变量
i := 0
//2.定义了一个匿名函数,给变量自增并返回
fun := func() int { //内层函数
i++
return i
}
//3.返回该匿名函数
return fun
}
Go函数高级的更多相关文章
- Scala学习——函数高级操作
scala函数高级操作 一.字符串高级操作 多行字符串和插值 package top.ruandb.scala.Course06 object StringApp { def main(args: A ...
- 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级
1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...
- python函数高级特性
掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...
- 【357】sorted 函数高级用法
参考:Python 内置函数sorted()在高级用法 - Brad1994 - 博客园 sorted 函数主要实现的就是对于可迭代对象进行排序,对于一维数据排序很好理解与实现,直接调用即可,本文主要 ...
- Scala函数高级操作
字符串高级操作:***** 非常重要 将函数赋值给变量/值def sayHello(name:String): Unit = { println(s"Hello:$name")} ...
- Scala中的函数高级使用
1.偏函数 1.基本介绍 在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范 ...
- pandas函数高级
一.处理丢失数据 有两种丢失数据: None np.nan(NaN) 1. None None是Python自带的,其类型为python object.因此,None不能参与到任何计算中. #查看No ...
- Oracle 函数高级查询
目录 oracle高级查询 Oracle SQL获取每个分组中日期最新的一条数据 求平均值(为0的参数不均摊) 字符串清除前面的0 判断字符串串是否包含某个字符串 switch 判断 oracle不足 ...
- Scala函数高级篇
一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...
- js高级之函数高级部分
基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 原型与原型链 prototype : 显式原型属性,它默认指向一个Object空对象(即称为: ...
随机推荐
- BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化
记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...
- postgresql + omniDB
docker:组装 使用Postgres数据库的web应用 登录到psql的方法: psql --host=localhost --dbname=database-name --username=po ...
- for循环与闭包
Es5 function box(){ var arr = []; ;i<;i++){ arr[i] = (function(num){ //自我执行,并传参(将匿名函数形成一个表达式)(传递一 ...
- RabbitMQ使用注意事项
用ConnectionFactory创建的TCP连接要复用,因为创建新的TCP连接比较耗时. IModel(信道)是轻量级的,可以用时创建. channel.BasicQos(0, 1, false) ...
- Gol流程控制
条件语句 if语句 if 布尔表达式 { }else 布尔表达式{ }else{ } if语句后的{,一定要和if条件写在同一行,否则报错 else一定要在if语句}之后,不能自己另起一行 if语句变 ...
- Windows常用批处理命令 CMD BAT (CMD目录操作等dir)
Windows常用批处理 CMD BAT CMD获取文件夹下所有文件的名称并打印(输出)到指定目录 dir C:\Users\\Desktop\png\*.*/s >c:\.txt //cmd ...
- linux 中对 mysql 数据库的基本命令
显示数据库列表 show databases; 显示库中的数据表 use mysql: // 打开库 show tables; 建库 create database 库名; 建库是设置好字符编码: c ...
- Java基本语法--关键字&标识符
本篇博客主要介绍了Java基本语法中的关键字.保留字和标识符. 关键字与保留字 关键字(keyword的定义及特点) ✄ 定义:被Java 语言赋予了特殊含义,用做专门用途的字符串 ✄ 特点:关键字中 ...
- windows10中docker nginx开启 但页面访问不了
Windows下对docker端口进行映射,但是当你在主机的浏览器中,打开localhost:port无法访问对应的服务. docker是运行在Linux上的,在Windows中运行docker,实际 ...
- 从心出发-刷leetcode写给5年后的自己
而立之年终未立,不惑而年犹存惑!这或许就是所谓的中年危机吧! 自认为是一个"勤奋"的人,又"未有寸功",天天碌碌,不知何为. "常立志"而未 ...