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函数高级的更多相关文章

  1. Scala学习——函数高级操作

    scala函数高级操作 一.字符串高级操作 多行字符串和插值 package top.ruandb.scala.Course06 object StringApp { def main(args: A ...

  2. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

    1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

  3. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  4. 【357】sorted 函数高级用法

    参考:Python 内置函数sorted()在高级用法 - Brad1994 - 博客园 sorted 函数主要实现的就是对于可迭代对象进行排序,对于一维数据排序很好理解与实现,直接调用即可,本文主要 ...

  5. Scala函数高级操作

    字符串高级操作:***** 非常重要 将函数赋值给变量/值def sayHello(name:String): Unit = { println(s"Hello:$name")} ...

  6. Scala中的函数高级使用

    1.偏函数 1.基本介绍 在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范 ...

  7. pandas函数高级

    一.处理丢失数据 有两种丢失数据: None np.nan(NaN) 1. None None是Python自带的,其类型为python object.因此,None不能参与到任何计算中. #查看No ...

  8. Oracle 函数高级查询

    目录 oracle高级查询 Oracle SQL获取每个分组中日期最新的一条数据 求平均值(为0的参数不均摊) 字符串清除前面的0 判断字符串串是否包含某个字符串 switch 判断 oracle不足 ...

  9. Scala函数高级篇

    一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...

  10. js高级之函数高级部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 原型与原型链 prototype : 显式原型属性,它默认指向一个Object空对象(即称为: ...

随机推荐

  1. Vuex项目实战store

    首先简单了解一下什么是Vuex? Vuex是一个专为Vue.js应用程序开发的状态管理模式.采用集中式存储来管理应用所有组件的状态. 以下是对vuex的使用的简单介绍: 一.安装 npm i vuex ...

  2. [ZJOI2008] 骑士 - 基环树dp

    一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...

  3. php环境安装问题

    1.如果图标是黄色,查看apache等服务是否全部启用:   2.如果启用了,查看80端口是否被占用->如果测试端口表明被占用->修改httpd.config文件:     1).Ctrl ...

  4. Python之二:基础知识

    1.常量: 1.1.数:5.1.23.9.25e-3 4种类型的数——整数.长整数.浮点数和复数 2是一个整数的例子. 长整数不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示1 ...

  5. Codeforces Round #601 (Div. 2) E1 Send Boxes to Alice (Easy Version)

    #include <bits/stdc++.h> using namespace std; typedef long long ll; ; int a[N]; int n; bool pr ...

  6. 计蒜客 - A1603.天上的星星

    二维差分,理论上很简单,虽然我实际上做的时候一堆问题 1.边界的星星包含在内,需要在减去的时候往前挪一个 2.我是从0开始的,循环的时候非常不方便 3.x1, x2, y1, y2总是弄混 #incl ...

  7. Centos7在防火墙中添加访问端口

    1.       查看jenkins启动状态命令:systemctl status Jenkins 保证jenkins启动,此处的状态为正在运行 2.       查看防火墙状态命令:systemct ...

  8. codeforces 1282 E. The Cake Is a Lie (dfs+构造)

    链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...

  9. c++指针实例

    #include <iostream> using namespace std; int main () { ; // 实际变量的声明 int* ip; // 指针变量的声明 ip = & ...

  10. DOM盒模型和位置 client offset scroll 和滚动的关系

    DOM盒模型和位置 client offset scroll 和滚动的关系 概览 在dom里面有几个描述盒子位置信息的值, pading border margin width height clie ...