站长网 语言 一篇文章带你清楚Go语言基础之函数

一篇文章带你清楚Go语言基础之函数

上次主要回顾上述我们知道,定义一个函数,可以将函数内存分配理解如下。同时我们也知道,无论进行什么操作,只会操作栈上面的值。函数和变量函数名即变量不知道你想过没,定义一个变量,接收一个函数,就像这样。package mainimport fmtfunc say() { fmt.P

上次主要回顾

上述我们知道,定义一个函数,可以将函数内存分配理解如下。

 

 

 

同时我们也知道,无论进行什么操作,只会操作栈上面的值。

 

函数和变量

函数名即变量

不知道你想过没,定义一个变量,接收一个函数,就像这样。

 

package main 

 

import "fmt" 

 

func say() { 

    fmt.Println("say") 

 

func main() { 

    var s1 = say 

    s1() 

执行结果如下。

 

 

 

可以发现,通过一个变量接收一个函数名,在通过变量名+括号执行,是没有问题的。

 

那么,这个变量是什么类型的呢???

 

fmt.Printf("%T\n",s1) 

执行结果

 

 

 

如果我将say函数改一下呢?

 

func say(s int) int{ 

    fmt.Println("say") 

    return 1 

fmt.Printf("%T\n",s1) 

 

 

可以发现,如果函数参数和返回值不一样,打印出来的类型也是不一样的。

 

定义函数类型

上述我们知道,可以通过变量接收一个函数名。

 

通过变量接收函数名是没有约束的,不管函数几个参数,几个返回值,都可以接收,真是活出了动态语言的样子。

 

而定义函数类型就是限制变量接收函数,只能接收指定格式的函数。

 

主要用到type关键字。

 

格式

 

type 变量名 func([参数类型,参数类型]) [返回值类型] 

 

中括号表示可选参数 

例如

 

type a func() 

type b func(int) 

type a func(int,int) int 

具体代码

 

package main 

 

import "fmt" 

 

/* 

    定义一个函数类型的变量 

    接收的函数参数必须是两个int类型 

    函数的返回值也必须是int类型 

*/ 

type cType func(int, int) int 

 

func say1(a, b int) int { 

    fmt.Println("say",a+b) 

    return 1 

func say2(a, b int) { 

    fmt.Println("say") 

 

func main() { 

    var s1 cType 

    s1 = say1//调用s1其实调用的就是say1 

    s1(1,1) 

 

    //var s2 cType 

    //s2 = say2//报错,cannot use say2 (type func(int, int)) as type cType in assignment 

高阶函数

千万不要被这个名字唬住了。

 

简单点说,高阶函数就是把函数当作参数或者把函数当作返回值。

 

函数当作参数

package main 

 

import "fmt" 

 

func add(x int, y int) int { 

    return x + y 

func calc(x int, y int, other func(int, int) int) int { 

    return other(x, y) 

func main() { 

    //将add函数传入第三个参数 

    var result = calc(34, 12, add) 

    fmt.Println(result) 

函数当作返回值

package main 

 

import "fmt" 

 

func add(x int, y int) int { 

  return x + y 

func test() (func(int, int) int) { 

  return add 

func main() { 

  var a = test() 

  fmt.Println(a(1,2)) 

至于上述两个的功能,恕小生不才,至今用到的场景不多。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/biancheng/yuyan/2021/1103/18896.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部