Go 语言函数学习笔记
1. 基本函数定义
package main
import "fmt"func test1() {fmt.Println("this is test1")
}func main() {test1()
}
- 使用
func
关键字定义函数。 test1
是一个无参数、无返回值的函数。
2. 接收参数并返回数据
package main
import "fmt"func test2(a, b uint8) uint8 {return a + b
}func main() {fmt.Println(test2(5, 6))
}
- 函数
test2
接收两个uint8
类型参数并返回一个uint8
类型的结果。 return
语句用于返回计算结果。
3. 多个返回值
package main
import "fmt"func test3(a, b int) (int, int) {return a + b, a - b
}func main() {x, y := test3(5, 6)fmt.Println(x, y)
}
- Go 语言支持函数返回多个值。
- 返回值可以使用多个变量接收。
4. 命名返回值
package main
import "fmt"func test4(a, b int) (result int) {result = a * breturn
}func main() {fmt.Println(test4(5, 6))
}
result
在函数定义时已经命名,不需要在return
语句中显式指定。
5. 密码检查(综合练习)
package main
import ("fmt""unicode/utf8"
)func pass_check(password string) bool {if utf8.RuneCountInString(password) < 8 || utf8.RuneCountInString(password) > 18 {return false}var lower, upper, number boolfor _, char := range password {switch {case char >= 'a' && char <= 'z':lower = truecase char >= 'A' && char <= 'Z':upper = truecase char >= '0' && char <= '9':number = true}if lower && upper && number {return true}}return false
}func main() {var pass stringfmt.Println("输入密码:")fmt.Scanln(&pass)if pass_check(pass) {fmt.Println("符合要求")} else {fmt.Println("不符合要求")}
}
utf8.RuneCountInString
计算字符串长度。switch
语句用于字符分类。- 逻辑优化:当满足条件时,提前
return true
,减少不必要遍历。
6. 可变长参数
package main
import "fmt"func test5(nums ...int) int {result := 0for _, v := range nums {result += v}return result
}func main() {fmt.Println(test5())fmt.Println(test5(1, 2, 3))
}
...int
表示可变参数,可以接受多个int
参数。- 传入的参数会被打包成切片
[]int
进行处理。
7. 匿名函数
package main
import "fmt"func main() {noname := func() {fmt.Println("noname 是一个匿名函数")}noname()result := func(a, b int) int {return a + b}(10, 20)fmt.Println(result)
}
- 匿名函数可以赋值给变量。
- 也可以在定义时直接调用。
8. 闭包
package main
import "fmt"func outer(x int) func(int) int {return func(y int) int {return x + y}
}func main() {add := outer(10)fmt.Println(add(5)) // 15
}
- 闭包 = 内部函数引用外部变量。
x
在outer
结束后仍然存在。
9. 函数作为参数
package main
import "fmt"type myFunc func(int, int) intfunc myfunc4(f myFunc, num1, num2 int) int {return f(num1, num2)
}func test4(a, b int) int {return a * b
}func main() {fmt.Println(myfunc4(test4, 10, 20))
}
func(int, int) int
作为参数。myFunc
类型别名提高可读性。
10. Go 不支持的特性(示例)
(1) 不支持函数嵌套
// Go 不允许在函数内定义命名函数
func test6() {// func test7() { // 这是错误的// }
}
(2) 不支持函数重载
// func test5() {} // 与上面的 test5 冲突
(3) 不支持默认参数
// func test6(a int = 10) {} // 语法错误
- Go 设计上不支持嵌套函数、重载、默认参数。
- 需要用匿名函数、可变参数、结构体等方式替代。
笔记源代码
// @FileName : 01go函数.go
// @Time : 2025/3/15 下午8:40
// @Author : luobozipackage mainimport ("fmt""unicode/utf8"
)// 此处开始编写代码
//go是函数式编程范式的语言,由函数组织结构
//可以把函数作为参数传递,也能返回函数
//支持多个返回值,支持命名参数返回,支持可变长参数,支持匿名参数,支持闭包,可以把函数作为参数传递、赋值、返回
//不支持有名函数的嵌套,不支持重载,不支持默认参数func main() {test1()fmt.Println(test2(5, 6))x, y := test3(5, 6) //多个返回值fmt.Println(x, y)z := test4(5, 6)fmt.Println(z)//检查密码var pass stringfmt.Println("输入密码:")fmt.Scanln(&pass)check := pass_check(pass)if check == true {fmt.Println("符合要求")} else {fmt.Println("不符合要求")}//调用可变长参数result1 := test5()result2 := test5(1)result3 := test5(1, 2)result4 := test5(1, 2, 3)fmt.Println(result1, result2, result3, result4)//匿名函数noname := func() {fmt.Println("noname是一个匿名函数")}noname()//定义匿名函数时调用usefunc := func(num1, num2 int) int {return num1 + num2}(10, 20)fmt.Println(usefunc)//函数作为返回值myf := myfunc()result := myf()fmt.Println(result)//把函数作为参数传递result5 := myfunc3(test4, 10, 20)fmt.Println(result5)// 自定义类型//type a int //自定义一个a类型,底层使用的还是int类型//var x1 a = 123//var y1 int = 456//fmt.Println(x1 + y1)//还是不可以计算//invalid operation: x1 + y1 (mismatched types a and int)}func test1() {fmt.Println("this is test1")
}// 接收参数,返回数据
func test2(a, b uint8) uint8 {return a + b //return返回 函数就退出了}// 支持多个返回值
func test3(a int, b int) (int, int) {result1 := a + bresult2 := a - breturn result1, result2
}// 支持命名参数返回
func test4(a, b int) (result int) {result = a * breturn
}//从键盘接收一串密码的输入,判断它是否符合要求
//长度在8-18之间,密码需要大写小写数字,返回真假func pass_check(password string) (pass bool) {pass_len := utf8.RuneCountInString(password)fmt.Println(pass_len)if pass_len < 8 || pass_len > 18 {return false}var lowercheck, uppercheck, numbercheck boolfor _, char := range password {if char >= 'a' && char <= 'z' {lowercheck = true} else if char >= 'A' && char <= 'Z' {uppercheck = true} else if char >= '0' && char <= '9' {numbercheck = true}}return lowercheck && uppercheck && numbercheck
}// 支持可变长参数
func test5(nums ...int) int {fmt.Printf("%T --> %v\n", nums, nums)result := 0for _, v := range nums {result += v}return result
}//packing(打包) 和unpacking(解包)
//函数传参 packing test(1,2,3) --> test5(nums ... int)
// 1,2,3 -->打包成 切片[1 2 3] 传递给--> nums
//如果点放在切片后面 unpacking [6 7 8]... 解包成-->6,7,8// 不支持有名函数嵌套
//# command-line-arguments
//.\01go函数.go:109:7: syntax error: unexpected test7, expecting (
//.\01go函数.go:113:1: syntax error: non-declaration statement outside function body
//func test6() {
// fmt.Println("this is test6")
// func test7() {
// fmt.Println("this is test6")
// }
//}// 不支持重载 一个包中函数的名字不能重复!
//.\01go函数.go:118:6: test5 redeclared in this block
//.\01go函数.go:92:6: other declaration of test5
//func test5() {
// fmt.Println("this is test5")
//}//不支持默认参数
//func test6(a int = 10) {
// fmt.Printf("%T --> %v\n", a, a)
//
//}// 将函数作为返回值
func myfunc() func() int {return func() int {fmt.Println("这是返回的函数")fmt.Println("返回一个整形")return 10}
}//func myfunc2(num1,num2 int) func (num1 int,str1 string) int {}func myfunc3(f func(int, int) int, num1, num2 int) int {return f(num1, num2)
}// 当函数太长,使用这种方式将函数作为参数传入
type myFunc func(int, int) intfunc myfunc4(f myFunc, num1, num2 int) int {return f(num1, num2)
}// 闭包
//一般情况下函数内的局部变量,调用的时候生成,而结束的时候会释放// 但是在闭包条件下,局部变量不会随着调用的结束而释放
// 1、有内外函数
// 2、外函数要返回内涵数
// 3、内函数要引用外函数的变量
func outer(x int) func(int) int {fmt.Println("x is :", x)return func(y int) int {fmt.Println("inner x is :", x)fmt.Println("inner x is :", y)return x + y}
}