go函数被设计为一等公民

在 Go 语言中,函数被设计为​​一等公民(First-Class Citizen)​​,这意味着函数可以像其他基本数据类型(如整数、字符串)一样被声明,可以当做参数,和返回值。

函数可赋值给变量​

  • ​实现方式​:将函数直接赋值给变量,或通过匿名函数实现
go 复制代码
// 定义函数类型
type Calculator func(a, b int) int

// 为 func() 创建别名
type MyFunc = func(a, b int) int

// 赋值普通函数
var add Calculator = func(a, b int) int { return a + b }

// 赋值匿名函数
square := func(x int) int { return x * x }

​函数可作为参数传递​和返回

  • ​高阶函数示例​:将函数作为参数传入其他函数,实现策略模式
go 复制代码
func ProcessData(data []int, operation func(int) int) []int {
    result := make([]int, len(data))
    for i, v := range data {
        result[i] = operation(v)
    }
    return result
}

// 使用示例
squared := ProcessData([]int{1,2,3}, func(x int) int { return x*x })

  • ​闭包实现​:返回一个携带外部作用域变量的函数
go 复制代码
func Counter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}

// 使用示例
counter := Counter()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2

​类型定义(Type Definition)

go 复制代码
package main

import "fmt"

// 定义新类型 MyFunc
type MyFunc func(int) int

// 原始函数类型
func add(a int) int { return a + 1 }

func main() {
    var f MyFunc = add       
// 编译错误:cannot use add (type func(int) int) as type MyFunc     in variable declaration
    var g MyFunc = MyFunc(add) // 正确:显式类型转换
    fmt.Println(g(5))        // 输出 6
}
  • MyFunc 是独立类型,与 func(int) int 不兼容
  • 必须通过 MyFunc(add) 显式转换才能赋值

类型别名(Type Alias)

go 复制代码
package main

import "fmt"

// 为 func() 创建别名
type MyFunc = func()

// 原始函数
func hello() { fmt.Println("Hello") }

func main() {
    var f MyFunc = hello   // 直接赋值,无需转换
    f()                    // 输出 Hello
}
  • MyFuncfunc() 的别名,类型完全等价
  • 可直接赋值,类型系统自动识别

结构体方法也可当做普通函数传递​

go 复制代码
package main

import (
	"fmt"
	"strconv"
	"time"
)

type Stu struct {
	Name string
	Age  int
}

func (s *Stu) sayHi() {
	fmt.Printf("hello ereryone. my name is %s ,my age is %d, \n", s.Name, s.Age)
}

type myF = func()

func clacMyf(f myF) {
	b := time.Now().UnixNano() // 纳秒级时间戳
	f()
	e := time.Now().UnixNano()
	fmt.Println("执行时间为:" + strconv.Itoa(int(e-b)) + "纳秒")
}
func main() {
	p := Stu{Name: "Alice", Age: 30}
	clacMyf(p.sayHi)
}

与其他语言的对比

​语言​ ​函数一等公民特性​ ​与 Go 的差异​
​JS​ 支持,动态类型 Go 为静态类型,类型安全性更高
​Java​ 需通过接口或 Lambda 实现(Java 8+) Go 无需接口,语法更简洁

相关推荐
源代码•宸几秒前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
smileNicky39 分钟前
SpringBoot系列之集成Pulsar教程
java·spring boot·后端
小翰子_1 小时前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端
踏浪无痕2 小时前
SQLInsight:从JDBC底层到API调用的零侵入SQL监控方案
数据库·后端·开源
superman超哥3 小时前
Rust HashSet与BTreeSet的实现细节:集合类型的底层逻辑
开发语言·后端·rust·编程语言·rust hashset·rust btreeset·集合类型
superman超哥4 小时前
Rust String与&str的内部实现差异:所有权与借用的典型案例
开发语言·后端·rust·rust string·string与str·内部实现·所有权与借用
愈努力俞幸运4 小时前
rust安装
开发语言·后端·rust
踏浪无痕4 小时前
JobFlow 负载感知调度:把任务分给最闲的机器
后端·架构·开源
UrbanJazzerati4 小时前
Python自动化统计工具实战:Python批量分析Salesforce DML操作与错误处理
后端·面试
我爱娃哈哈4 小时前
SpringBoot + Seata + Nacos:分布式事务落地实战,订单-库存一致性全解析
spring boot·分布式·后端