Go语言函数详解(二)

102 阅读4分钟

在Go语言编程中,函数是实现模块化编程的核心,它不仅提升了代码的复用性、降低了冗余性,同时也大大增强了代码的可维护性

 

一、函数的引入与基础语法

1. 函数的定义

函数是为了完成某一功能而组织的一组语句集合。其基本语法格式如下:

func 函数名(形参列表)(返回值类型列表){

    执行语句

    return 返回值列表

}

2. 函数命名规范

遵循标识符命名规则,建议采用驼峰命名法(如:addNum);

首字母大写:表示该函数可被本包和其他包访问(类似 public);

首字母小写:表示函数仅在当前包内可见(类似 private)。

3. 形参与实参

形参用于接收外部传入的数据;

实参是调用函数时实际传入的值;

函数可以有0个、1个或多个参数

函数也可以返回0个、1个或多个返回值

如果有不需要接收的返回值,可用下划线 _ 进行忽略。

4. 特性与补充说明

Go语言不支持函数重载

支持可变参数(通过 ... 语法,如:args ...int);

函数参数默认是值传递,若希望在函数内修改外部变量的值,应传入变量地址(&)并在函数中以指针操作;

函数可以作为变量,即函数也是一种数据类型;

函数可以作为参数传递,也可以作为返回值

可以通过 type 定义自定义函数类型,简化函数声明。

5. 返回值命名

Go支持对函数的返回值进行命名,可以简化 return 语句:

func calculate(num1 int, num2 int)(sum int, diff int){

    sum = num1 + num2

    diff = num1 - num2

    return

}


二、包(Package)的使用

1. 为什么使用包

管理函数更加结构化和模块化

可解决同名冲突问题。

2. 使用方式

(1)使用 package 包名 声明包;

(2)使用 import "路径" 导入包;

包路径从 $GOPATH/src/ 开始计算;

支持批量导入包:

import (

    "fmt"

    "mypkg/math"

)

3. 相关规则

(1)main 包是程序入口,main 函数需放在该包中;

(2)同一目录下的源文件属于同一个包;

(3)包名可以与文件夹名不同;

(4)可以为包指定别名,别名使用后,原包名失效;

(5)包中变量或函数首字母大写表示可被外部访问。

三、init函数

每个源文件可以包含一个 init() 函数;

在程序启动时,Go会自动调用 init() 函数,且在 main() 执行前完成;

执行顺序为:全局变量定义 → init函数 → main函数

 

四、匿名函数

Go支持匿名函数,适用于只使用一次的简单操作。

使用方式:

1) 定义后立即调用(常用):

result := func(a int, b int) int {

    return a + b

}(10, 20)

2) 赋值给变量后调用

f := func(a int, b int) int {

    return a + b

}

fmt.Println(f(10, 20))

五、闭包(Closure)

1. 定义

闭包是函数与其引用的变量环境共同构成的一个整体。

2. 本质

闭包是一个引用了外部变量的匿名函数,通过函数+环境变量的组合,形成持久性。

3. 特点

变量会持续存在于内存中;

适用于需要记忆上一次状态的场景;

不可滥用,否则可能引起内存泄露。

4. 应用场景

例如记忆上一次的结果、状态机模型、工厂函数等。

六、defer关键字

1. 定义

defer 用于延迟执行语句,在函数返回前执行,常用于资源释放。

2. 执行顺序

defer语句按“先进后出”的方式执行;

执行时会将相关的值拷贝入栈,不会因为后续变量变化而影响。

3. 应用场景

文件关闭、解锁、网络连接关闭等资源释放操作:

file, _ := os.Open("file.txt")defer file.Close()

七、系统函数

一、字符串相关函数(需 import "strings" "strconv"

功能函数
字符串长度len(str)
遍历字符串for i, v := range str
字符串转整数strconv.Atoi("66")
整数转字符串strconv.Itoa(123)
判断是否包含strings.Contains("abc", "a")
子串出现次数strings.Count("aaab", "a")
忽略大小写比较strings.EqualFold("Go", "go")
查找子串位置strings.Index("abc", "b")
替换子串strings.Replace("go-go", "go", "GoLang", -1)
拆分字符串strings.Split("a-b-c", "-")
字母大小写转换strings.ToUpper("go"), strings.ToLower("GO")
去除空格strings.TrimSpace(" hello ")
去除指定字符strings.Trim("go", "~")
判断前缀后缀strings.HasPrefix(str, "http"), strings.HasSuffix(str, ".png")

二、时间相关函数(需 import "time"

获取当前时间:time.Now()

时间格式化:

now := time.Now()

fmt.Println(now.Format("2006-01-02 15:04:05")) // 固定格式模板

三、内置函数(无需导包)

函数功能
len()获取长度
new()分配值类型内存(返回指针)
make()分配引用类型内存(如 map、slice、chan)

 

总结

本文系统梳理了Go语言中函数的定义、使用与进阶内容,包括匿名函数、闭包、init函数、defer机制以及内置函数和字符串、时间的操作。掌握这些基础与进阶内容,将极大提升你在Go项目开发中的编程效率和代码质量。