【Golang】Golang基础语法(六):函数

函数

与 C++ 相比,Golang 的函数编程更加的方便简洁。

Golang 具体的函数定义和函数用法如下例所示:

go 复制代码
package main

import (
	"fmt"
	"math"
	"reflect"
	"runtime"
)

func div(a, b int) (int, int) {		// Golang 的函数可以有多个返回值
	return a / b, a % b
}

func eval(a, b int, op string) (int, error) {
	switch op {
	case "+":
		return a + b, nil
	case "-":
		return a - b, nil
	case "*":
		return a * b, nil
	case "/":
		q, _ := div(a, b)
		return q, nil
	default:
		return 0, fmt.Errorf("unsupported operation: " + op)
	}
}

func apply(op func(int, int) int, a, b int) int {	// Golang 函数的参数可以是一个函数
	p := reflect.ValueOf(op).Pointer()
	opName := runtime.FuncForPC(p).Name()
	fmt.Printf("Calling function %s with args "+"(%d, %d)\n", opName, a, b)
	return op(a, b)
}

func pow(a, b int) int {							// 回顾之前的内容, Golang 不支持任何隐式类型转换
	return int(math.Pow(float64(a), float64(b)))	// 因此必须使用显式类型转换
}

func sum(numbers ...int) int {						// Golang 的函数不支持默认参数或可选参数
	s := 0											// 但 Golang 的函数支持可变数量的参数, 如本例所示
	for i := range numbers {
		s += numbers[i]
	}
	return s
}

func main() {
	if result, err := eval(3, 4, "+"); err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Result:", result)
	}

	fmt.Println(apply(pow, 3, 4)) // 函数的参数也可以是一个函数
	// 👆 函数式编程

	fmt.Println(
		apply(func(a, b int) int {
			return int(math.Pow(float64(a), float64(b)))
		}, 3, 4)) // 可以直接通过匿名函数的方式将函数传递给
	// 与 C++ 11 新增的 lambda 表达式相比, Golang 的 lambda 表达式不要太简洁

	fmt.Println(sum(1, 2, 3, 4, 5)) // 可变参数列表

	/*
		Golang 函数语法要点回顾
		- 返回值类型写在最后面;
		- 可以返回多个值;
		- 函数可以作为参数(支持函数式编程)
		- 没有默认参数/可选参数
	*/
}

Golang 函数的要点总结如下:

  1. 与变量的定义类似,Golang 的函数定义是函数名称在前,返回值类型(或具体的返回值!)在后;
  2. Golang 当中的函数可以有多个返回值;
  3. Golang 函数的参数可以是一个函数,这个实参可以是 lambda 表达式。与 C++ 11 当中的 lambda 表达式相比,Golang 当中的 lambda 表达式非常的简洁,可以把它看作是一个局部的函数定义,不需要额外的声明;
  4. Golang 的函数不支持默认参数或可选参数,但支持可变形参数量的参数,可变形参数量的参数相当于将传入的实参列表封装为一个数组,在函数定义当中可以使用 for 对形参进行遍历。
相关推荐
tiana_3 小时前
写了个零依赖的 Go 版本管理器,curl | bash 完事
开发语言·golang·bash
灯澜忆梦5 小时前
GO---map函数
开发语言·前端·后端·golang
北冥you鱼5 小时前
Go语言与默克尔树:区块链数据完整性的基石
开发语言·golang·区块链
布朗克1687 小时前
Go 入门到精通-15-错误处理
开发语言·python·golang·错误处理
北冥you鱼9 小时前
Go-Ethereum (Geth) 最佳实践:从部署到生产环境优化
开发语言·后端·golang
李燚1 天前
Eino devops 调试系统源码:GraphCompileCallback 怎么工作(第50篇-E36)
数据库·golang·agent·devops·graphql·aiagent·eino
名字还没想好☜1 天前
Go 内存逃逸分析:什么时候变量跑到堆上
开发语言·算法·性能优化·golang·go·内存逃逸
ttwuai1 天前
后台管理系统 RBAC 排障:隐藏菜单后接口为什么还能调用
golang
Wang's Blog1 天前
Go-Zero框架上手前奏2: 微服务核心要素 —— 拆分、通信与无状态设计
开发语言·微服务·golang
Generalzy2 天前
从本地 Demo 到生产级检索:Milvus 学习笔记(2)
golang·milvus