【Go】函数学习笔记

news/2025/3/30 3:01:07/

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
}

学习笔记

  • 闭包 = 内部函数引用外部变量。
  • xouter 结束后仍然存在。

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}
}

http://www.ppmy.cn/news/1583377.html

相关文章

在opensuse 系统上安装腾讯会议

需求描述 平常比较习惯使用opensuse 系统&#xff0c;又有远程开会的需求&#xff0c; 所以需要在opensuse 系统上安装腾讯会议。但是需要注意的是&#xff0c;opensuse上面的软件安装包是rpm文件&#xff0c;而腾讯会议的LINUX版本只提供了deb格式的文件&#xff0c;没有办法…

openai-agents-python中 agents_as_tools.py 示例

代码 import asyncio import osfrom openai import AsyncOpenAIfrom agents import (Agent,Runner,function_tool,set_default_openai_api,set_default_openai_client,set_tracing_disabled, )BASE_URL "https://open.bigmodel.cn/api/paas/v4/" API_KEY "you…

Qt下集成大华网络相机SDK示例开发

文章目录 前言一、下载并集成大华网络相机SDK二、示例实现功能三、示例完整代码四、下载链接总结 前言 近期在Qt环境下进行大华网络相机的使用&#xff0c;发现官网下载的SDK中提供的示例没有Qt的demo&#xff0c;通过学习其提供的MFC示例代码&#xff0c;我在这里也实现了一个…

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…

【CXX-Qt】2.3 类型

CXX-Qt 支持大多数 CXX 支持的类型。这些类型可以用于属性、可调用方法和信号中。 cxx-qt-lib 类型 cxx-qt-lib crate 提供了常见 Qt 类型的 CXX 绑定。 使用 cxx-qt-lib 文档 来探索可用的类型。 容器类型 cxx-qt-lib crate 提供了容器类型&#xff0c;例如 QSet。 要使…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

iPhone 16如何翻译文档?文档翻译技巧、软件推荐

在全球化的今天&#xff0c;跨语言交流变得越来越频繁&#xff0c;而文档翻译更是成为许多人日常工作和学习中的重要需求。作为苹果公司最新推出的旗舰机型&#xff0c;iPhone 16凭借其强大的硬件性能和丰富的软件生态&#xff0c;为我们提供了多种便捷的文档翻译方式&#xff…

JVM常见面试总结

JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心&#xff0c;掌握JVM相关知识对于Java开发者至关重要。以下是JVM常见的面试问题总结&#xff1a; 1. JVM内存模型 问题&#xff1a;JVM的内存结构分为哪些部分&#xff1f; 答案&#xff1a; 方法区&#xff08;Met…