Go:函数
函数
函数声明
func name(parameter-list) (result-list) { body }
- 函数声明包含函数名、形参列表、可选的返回列表以及函数体 。形参列表指定由调用者传递的变量参数名和类型;返回列表指定函数返回值类型 ,无返回值或返回未命名值时,返回列表括号可省略 。
func hypot(x, y float64) float64 {return math.Sqrt(x * x + y * y)
}
hypot
函数:func hypot(x, y float64) float64
,x
和y
是形参,调用时如hypot(3, 4)
,3
和4
是实参 ,函数返回float64
类型值 。
func f(i, j, k int, s, t string)
func f(i int, j int, k int, s string, t string)
- 形参和返回值的简写:若多个形参或返回值类型相同,类型只需写一次 ,上述两种情况等价 。
func add(x int, y int) int { return x + y }
func sub(x, y int) (z int) { z = x - y; return }
func first(x int, _ int) int { return x }
func zero(int, int) int { return 0 }
- 函数声明的多种方式:声明带两个形参和一个返回值(变量均为
int
类型 )的 4 种方式 ,包括常规写法和形参未使用时用空白标识符的写法 。
类型与签名
- 函数的形参列表和返回列表构成函数签名 ,当两个函数形参列表和返回列表相同,就认为它们类型或签名相同 ,形参和返回值名字、简写方式不影响函数类型 。
调用规则
- 调用函数需按顺序提供与形参对应的实参 ,Go 语言无默认参数值,不能指定实参名 。形参是函数最外层局部变量,初始值由实参传递 ,函数形参和命名返回值变量属函数局部作用域 。实参按值传递,函数接收实参副本 ,但当实参为引用类型(指针、slice、map 等 )时,函数可能间接修改实参变量 。
特殊的函数声明
- 有些函数声明无函数体,意味着该函数用 Go 以外语言实现 ,如
package math
中的func Sin(x float64) float64
,Sin
函数使用汇编语言实现 。
递归
- 函数可递归调用,即直接或间接调用自身 ,能处理具有递归特性的数据结构 。
package mainimport ("fmt""os""golang.org/x/net/html"
)func main() {doc, err := html.Parse(os.Stdin)if err != nil {fmt.Fprintf(os.Stderr, "findlinks1: %v\n", err)os.Exit(1)}for _, link := range visit(nil, doc) {fmt.Println(link)}
}func visit(links []string, n *html.Node) []string {if n.Type == html.ElementNode && n.Data == "a" {for _, a := range n.Attr {if a.Key == "href" {links = append(links, a.Val)}}}for c := n.FirstChild; c != nil; c = c.NextSibling {links = visit(links, c)}return links
}
-
findlinks1
程序:查找 HTML 超链接的递归实现。主函数从标准输入读入 HTML ,调用递归函数visit
获取超链接 。visit
函数遍历 HTML 树节点,当节点是元素节点且有a
标签属性时,提取href
属性值添加到字符串 slice ,并递归访问子节点 ,最后输出找到的所有超链接 。可将fetch
程序输出定向到findlinks1
,获取网页超链接 。 -
使用:
go build .\ch1\fetch\
go build .\ch5\findlinks1\
.\fetch.exe https://baidu.com | .\findlinks1.exe
http://news.baidu.com
http://www.hao123.com
http://map.baidu.com
http://v.baidu.com
http://tieba.baidu.com
//www.baidu.com/more/
http://home.baidu.com
http://ir.baidu.com
http://www.baidu.com/duty/
http://jianyi.baidu.com/
package mainimport ("fmt""os""golang.org/x/net/html"
)func main() {doc, err := html.Parse(os.Stdin)if err != nil {fmt.Fprintf(os.Stderr, "outline: %v\n", err)os.Exit(1)}outline(nil, doc)
}func outline(stack []string, n *html.Node) {if n.Type == html.ElementNode {stack = append(stack, n.Data)fmt.Println(stack)}for c := n.FirstChild; c != nil; c = c.NextSibling {outline(stack, c)}
}
outline
程序:输出 HTML 文档结构的递归实现。使用递归遍历 HTML 文本节点树并输出结构 。outline
函数遇到元素节点时将标签压入栈并输出栈内容,然后递归访问子节点 。递归过程中栈的副本传递,被调函数对栈操作不影响调用者原栈 。通过该程序可查看如https://baidu.com
页面的 HTML 结构 。
递归栈
- 许多编程语言栈长度固定(64KB - 2MB ),深度递归可能栈溢出 。Go 语言使用可变长度栈,上限可达 1GB 左右 ,能安全使用递归 。
多返回值
- Go 语言中函数可返回多个结果 ,常见于标准包内函数返回计算结果与错误值、表示函数调用是否正确的布尔值等情况 。
func findlinks(url string) ([]string, error) {resp, err := http.Get(url)if err != nil {return nil, err}if resp.StatusCode != http.StatusOK {resp.Body.Close()return nil, fmt.Errorf("getting %s: %s", url, resp.Status)}doc, err := html.Parse(resp.Body)resp.Body.Close()if err != nil {return nil, fmt.Errorf("parsing %s as HTML: %v", url, err)}return visit(nil, doc), nil
}
findLinks
函数:findLinks
函数发起 HTTP GET 请求,解析返回的 HTML 页面并返回所有链接 ,声明为func findLinks(url string) ([]string, error)
。- 实现:函数中先发起请求,若请求出错直接返回错误;若状态码非
http.StatusOK
,关闭响应体并返回错误 ;接着解析 HTML ,若解析出错也返回错误 ;成功时返回链接 slice 和空错误值 。要确保响应体resp.Body
正确关闭以释放网络资源 。
调用与处理
-
变量赋值:调用多返回值函数时,调用者需显式将返回值赋给变量 ,如
links, err := findLinks(url)
,也可忽略某个返回值,用空白标识符_
,如links, _ := findLinks(url)
。 -
嵌套调用:多返回值可用于调用另一个多值返回的函数 ,如
findLinksLog
函数在findLinks
基础上增加记录参数的动作 。多值调用还可作为实参传递给有多个形参的函数 ,方便调试 。 -
命名返回值:函数可定义命名返回值 ,这些变量在函数内初始化为对应类型零值 ,可省略
return
语句操作数 ,称为裸返回 。裸返回虽能减少代码重复,却可能使代码可读性变差,应谨慎使用 。
错误
- 有些函数总是能成功返回结果,如
strings.Contains
和strconv.FormatBool
,对所有可能参数都有定义好的返回 ,即使存在内存耗尽等极端情况,其错误表现和起因复杂且恢复渺茫 。 - 部分函数符合前置条件就能成功返回,如
time.Date
,但参数不当会导致宕机 。 - 还有很多函数受外部因素影响,不能保证一定成功返回,如 I/O 操作函数 ,这些地方是错误处理的重点 。
返回方式
- 函数调用发生错误时,习惯将错误值作为最后一个结果返回 。若错误情况单一,结果常设为布尔类型 ,如
cache.Lookup
,成功返回值和true
,键不存在返回false
。对于 I/O 等操作,错误原因多样,返回类型常为error
。
error 类型
error
是内置接口类型 ,一个错误可能为空值(表示成功 )或非空值(表示失败 ) ,非空错误类型有错误消息字符串 ,可通过Error
方法或fmt.Println
、fmt.Printf
输出错误消息 。
错误处理原则
- 当函数返回非空错误时,其他结果通常无定义应忽略 ,但有些函数出错时会返回部分可用结果 ,调用者应先处理错误 。Go 语言通过普通返回值报告错误 ,而非异常机制(Go 语言异常仅针对程序 bug 导致的预料外错误 ) ,使用常规控制流(如
if
和return
)处理错误 ,虽要求更谨慎,但这是设计要点 。
错误处理策略
- 传递错误
当函数调用返回错误时,将错误直接传递给调用者 。如findLi nks
函数中,http.Get
失败时直接返回错误 ;html.Parse
失败时,构建包含相关信息的新错误消息再返回 。设计错误消息要慎重,包含充足相关信息且保持一致 ,像os
包的文件操作函数返回的错误就包含文件名字等信息 。
- 重试操作
对于不固定或不可预测的错误,在短时间间隔后重试 。如WaitForServer
函数尝试连接 URL 对应的服务器 ,设置超时时间,在规定时间内多次重试 ,超过重试次数和限定时间后报错退出 。
- 输出错误并停止程序
若错误无法顺利解决,输出错误信息后优雅停止程序 。一般库函数将错误传递给调用者,主程序部分可处理错误并停止 ,可使用log.Fatalf
实现,也可自定义日志输出格式 。
- 记录错误并继续运行
在一些错误情况下,仅记录错误信息,程序继续运行 。可使用log
包记录日志,也可直接输出到标准错误流 。
- 忽略错误
在某些特殊情况(如操作系统会周期性清理临时目录 )下,直接忽略错误 。但有意忽略错误时要清楚逻辑后果,函数错误处理通常在开头检查并返回错误,再执行实际函数体 。
文件结束标识
当从文件读取数据时,若要读取的字节数为文件长度,任何错误都代表操作失败 ;若反复读取固定大小数据块直到文件耗尽,就需区分读取到文件尾和遇到其他错误的情况 。
io.EOF
的定义
io
包中定义了io.EOF
,用于表示由文件结束引起的读取错误 ,其定义为var EOF = errors.New("EOF")
,即当没有更多输入时返回 。
io.EOF
的使用
in := bufio.NewReader(os.Stdin)
for {r, _, err := in.ReadRune()if err == io.EOF {break}if err != nil {return fmt.Errorf("read failed: %v", err)}// ...使用r
}
- 使用
bufio.Reader
的ReadRune
方法读取 ,当err == io.EOF
时表示读取到文件结束 ,退出循环 ;若err != nil
则表示其他错误 ,返回错误信息 。io.EOF
有固定错误消息 ,而对于其他错误 ,可能需要更多错误本质原因和数量信息 。
函数变量
func square(n int) int { return n * n }f := squeare
fmt.Println(f(3))
函数在 Go 语言中是头等重要的值 ,函数变量有类型 ,可赋值给变量、传递或从其他函数返回 ,也能像普通函数一样调用 。函数类型零值是nil
,调用nil
函数会导致宕机 ,函数变量可与nil
比较,但函数变量本身不可相互比较,也不能作为map
键值 。
func add1(r rune) rune { return r + 1 }fmt.Println(strings.Map(add1, "Admix")) // "Benjy"
以strings.Map
为例,它对字符串每个字符应用一个函数并连接结果 ,如add1
函数配合strings.Map
实现对字符串中字符的操作 。
匿名函数
- 命名函数在包级别作用域声明,匿名函数则可在表达式内定义 ,无函数名称 ,像函数字面量 。如
strings.Map
调用时可直接定义匿名函数 。
func squares() func() int {var x intreturn func() int {x++return x * x}
}func main() {f := squares()fmt.Println(f()) // 1fmt.Println(f()) // 4 fmt.Println(f()) // 9 fmt.Println(f()) // 16
}
- 匿名函数能获取整个词法环境 ,以
squares
函数为例,它返回一个匿名函数 ,该匿名函数可引用并修改外层函数的局部变量x
,每次调用返回x
的平方并递增x
,体现了函数变量可拥有状态 ,这种函数类型称为引用类型 ,且函数变量因闭包原因无法比较 。
警告:捕获迭代变量
var rmdirs []func() for _, dir := range tempDirs() {dir := dir // 声明内部 dir,并以外部dir初始化os.MkdirAll(dir, 07555)rmdirs = append(rmdirs, func() {os.RemoveAll(dir)}) }// ...处理for _, rmdir := range rmdirs {rmdir() // 清理 }
问题示例
以创建并删除一系列目录为例 ,代码中使用包含函数变量的 slice 进行清理操作 。若在
for - range
循环中直接使用循环变量dir
创建匿名函数 ,会出现问题 。因为循环变量dir
在循环引入的块作用域内声明 ,循环内创建的所有函数变量共享该变量的存储位置 ,其值在迭代中不断更新 。当调用清理函数时,dir
已被更新多次 ,实际取值是最后一次迭代的值 ,导致所有os.RemoveAll
调用都试图删除同一个目录 。解决方法
为避免此问题,可在循环内引入一个新的局部变量 ,将循环变量赋值给它 ,如
dir := dir
,相当于创建一个副本 ,这样每个匿名函数捕获的是不同的变量值 。
变长函数
func sum(vals ...int) int {total := 0for _, val := range vals {total += val}return total
}
变长函数在调用时可接受可变数量的参数 ,在参数列表最后的类型名称前使用省略号 “…” 声明 。如func sum(vals ...int) int
,在函数体内vals
是int
类型的 slice ,可接收任意数量的int
参数 。
调用方式
- 可直接传递多个参数调用 ,如
sum(1, 2, 3, 4)
。 - 当实参已存在于 slice 中时,在最后一个参数后面放省略号调用 ,如
values := []int{1, 2, 3, 4}; sum(values...)
。变长函数类型与带普通 slice 参数的函数类型不同 。
func errorf(linenum int, format string, args ..interface{}) {fmt.Fprintf(os.Stderr, "Line %d: ", linenum)fmt.Fprintf(os.Stderr, format, args...)fmt.Fprintln(os.Stderr)
}
常用于格式化字符串 ,以errorf
函数为例 ,它构建格式化错误消息 ,第一个参数为行号 ,第二个参数为格式字符串 ,后面可变参数为interface{}
类型 ,可接受任意值 。
延迟函数调用
func title(url string) error {resp, err := http.Get(url)if err != nil {return err}defer resp.Body.Close();// ...return nil
}
在处理网络请求和资源释放时 ,存在重复调用resp.Body.Close()
来关闭网络连接的情况 。随着函数逻辑变复杂 ,这种重复操作会带来维护问题 ,defer
机制可简化此类工作 。
- 语法:
defer
语句是在普通函数或方法调用前加上defer
关键字 ,函数和参数表达式在语句执行时求值 。 - 执行规则:无论函数正常执行完(遇到
return
语句 )还是发生宕机等异常情况 ,defer
调用都推迟到函数结束时执行 ,且按调用defer
语句顺序的倒序执行 ,defer
语句使用次数无限制 。
应用场景
func ReadFile(filename string) ([]btye, error) {f, err := os.Open(filename)if err != nil {return nil, err}defer.Close()return ReadAll(f)
}var mu sync.Mutex
var m = make(map[string]int)
func lookup(key string) int {mu.lock()defer mu.unlock()return m[key]
}
- 资源管理:用于成对操作 ,如打开和关闭文件(
io/ioutil
包中ReadFile
函数使用defer
关闭文件 )、连接和断开网络连接(title
函数中用defer resp.Body.Close()
关闭响应体 )、加锁和解锁(sync.Mutex
相关操作 )等 ,确保资源在任何情况下都能正确释放 。
func bigSlowOperation() {defer trace("bigSlowOperation")()// ...timeSleep(10 * time.Second)
}func trace(msg string) func() {start := time.Now()log.Printf("enter %s", msg)return func { log. Printf("exit %s (%s)", msg, time.Since(start)) }
}
- 函数调试:在复杂函数 “入口” 和 “出口” 设置调试行为 ,如
bigSlowOperation
函数配合trace
函数 ,记录进入和退出函数的时间及时间差 。
func double(x int) (result int) {defer func() { fmt.Printf("double(%d) = %d\n", x, result) }()return x + x
}
func triple(x int) (result int) {defer func() { result += x }return double(x)
}
- 修改返回结果:延迟执行的匿名函数可更新函数结果变量 ,如
double
和triple
函数通过defer
语句在返回前输出参数和结果 ,或改变返回给调用者的结果 。
注意事项
for _, filename := range filenames {f, err := os.Open(filename)if err != nil {return err}defer f.Close() // 注意:可能会用尽文件描述符// ...
}// 解决方法
for _, filename := range filenames {if err := doFile(filename); err != nil {return err}
}func doFile(filename string) error {f, err := os.Open(filename)if err != nil {return err}defer f.Close()// ...
}
在循环中使用defer
语句要注意 ,若处理完后没关闭文件 ,可能导致资源未正确释放 ,可将循环体(含defer
语句 )放到另一个函数中解决 。
宕机
Go 语言类型系统捕获编译时错误,但运行时数组越界、空指针引用等错误会引发宕机 。宕机发生时,正常程序执行终止,goroutine 中延迟函数执行,程序异常退出并留下日志消息 ,包含宕机值和函数调用栈跟踪信息,可辅助诊断问题 。
主动触发
- 可直接调用内置的
panic
函数触发宕机 ,如在逻辑上不可能到达的分支 ,或遇到 “不可能发生” 的状况时 。但设置断言检查时需谨慎 ,若无法提供有效错误消息或快速检测错误 ,运行时断言检查无意义 。
使用场景
- 仅在发生严重错误,如与预期逻辑不一致时使用宕机 ,稳健代码应优先处理 “预期的” 错误(如错误输入、配置或 I/O 失败 ) ,通过返回错误值区分 。
func Compile(expr string) (*Regexp, error) { /*...*/ }
func MustCompile(expr string) *Regexp {re, err := Compile(expr)if err != nil {panic(err)}return re
}
- 以
regexp
包为例,regexp.MustCompile
是包装函数 ,在编译正则表达式出错时触发宕机 ,方便初始化包级别的正则表达式变量 ,但不应接收不正确的值 。
宕机时延迟函数的执行
- 宕机发生时,所有延迟函数按倒序执行 ,从栈顶函数开始返回至
main
函数 ,通过示例展示了延迟函数在宕机前后的执行顺序 。
宕机状态恢复
runtime
包提供runtime.Stack
等方法 ,可输出函数栈信息 ,辅助诊断错误 ,且函数可从宕机状态恢复至正常运行状态避免程序退出 。
恢复
通常退出程序是处理宕机的方式,但在某些情况下可进行恢复 ,如 Web 服务器遇到未知错误时 ,可先清理状态再汇报错误 。recover
函数在延迟函数内部调用 ,能终止当前宕机状态并返回宕机值 ,若在非延迟函数中调用或无宕机发生则返回nil
。
func Parse(input string) (s *Syntax, err error) {defer func() {if p := recover(); p != nil {err = fmt.Errorf("internal error: %v", p)}}()// ...
}
- 以
Parse
函数为例 ,在延迟函数中使用recover
从宕机状态恢复 ,利用宕机值组成错误消息 ,并可结合runtime.Stack
包含调用栈信息 ,将错误赋给结果变量返回给调用者 。
func soleTitle(doc *html.Node) (title string, err error) {type bailout struct{}defer func() {switch p := recover(); p {case nil:// 没有宕机case bailout{}:// "预期的"宕机err = fmt.Errorf("multiple title elements")default:panic(p) // 未知宕机;继续宕机}}()forEachNode(doc, func(n *html.Node)) {if n.Type == html.ElementNode && n.Data == "title" &&n.FirstChild != nil {if title != "" {panic(bailout{})}title = n.FirstChild.Data}}, nil)if title == "" {return "", fmt.Errorf("no title element")}return title, nil
}
- 对于
soleTitle
函数 ,处理 HTML 文档标题时 ,若文档含多个<title>
元素会触发宕机 ,通过延迟函数调用recover
,检查宕机值 。若为特定类型bailout
,返回普通错误;若为其他非空值 ,说明是预料外宕机 ,继续宕机过程 。
原则
- 无差别恢复不可靠 ,因为宕机后包内变量状态可能不明确 ,可能存在数据结构更新错误、资源未关闭或未释放等问题 。
- 一般不应尝试恢复来自其他包或非自己维护代码中的宕机 ,公共 API 应直接报告错误 。如
net/http
包的 Web 服务器 ,虽可使用recover
输出栈跟踪信息后继续工作 ,但存在资源泄露等风险 。 - 最安全做法是选择性使用
recover
,可通过明确的非导出类型作为宕机值 ,检测recover
返回值是否为此类型来处理宕机 ,不是则继续触发宕机 。
参考资料:《Go程序设计语言》
相关文章:
Go:函数
函数 函数声明 func name(parameter-list) (result-list) { body }函数声明包含函数名、形参列表、可选的返回列表以及函数体 。形参列表指定由调用者传递的变量参数名和类型;返回列表指定函数返回值类型 ,无返回值或返回未命名值时,返回列…...
swagger 注释说明
一、接口注释核心字段 在 Go 的路由处理函数(Handler)上方添加注释,支持以下常用注解: 注解名称用途说明示例格式Summary接口简要描述Summary 创建用户Description接口详细说明Description 通过用户名和邮箱创建新用户Tags接口分…...
【C++】C与C++、C++内存空间、堆与栈
C嘎嘎嘎嘎嘎~ C与C的区别与联系 C内存空间 int global_var; // 未初始化全局变量,BSS段 const char* str "Hello"; // 字符串常量text段 in数据段void func() {static int static_var; // 未初始化的静态变量,数据段int local_var; …...
从零训练LLM-1.训练BPE
文章目录 BPE 简介BPE (Byte-Pair Encoding) 算法训练流程BPE 编码流程BPE 评估代码 参考 本文基于 HF -tokenizer 训练,更便捷 BPE 简介 分词器将单词从自然语言通过“词典”映射到0, 1, 36这样的数字,可以理解为数字就代表了单词在“词典”中的页码。…...
shield.io网站|markdown中适用的“徽标”
动态的我还没看是怎么弄,但是应该和静态的差不多,因此本文仅讨论静态徽标 静态徽标效果 创建方法 网址:Shields.io | Shields.io 进入之后点击“Badges”标签进入网页创建徽标的页面,根据文档中对每个属性的介绍在右侧将自己预…...
Vue 3 自定义指令
Vue 3 是一个非常强大的前端框架,它不仅提供了简单易用的 API,还支持多种高级功能,以便开发者根据需要扩展和优化应用。在 Vue 中,自定义指令是一种非常灵活的功能,它允许我们为 DOM 元素添加特定的行为,扩…...
25某团校招后端开发一面
一、进程通信和线程通信方式 进程通信方式 管道(Pipe) 半双工通信,数据单向流动,仅用于有亲缘关系的进程(如父子进程)。通过内核缓冲区实现数据传输,如父进程写、子进程读。命名管道ÿ…...
音视频学习(三十四):H264中的宏块
什么是宏块? 在 H.264 中,宏块是编码图像时最小的处理单位。它的核心作用包括: 帧内预测(Intra Prediction)帧间预测(Inter Prediction)变换、量化、熵编码等 标准定义: 一个宏块…...
Pandas 中透视表(`pivot_table`)和交叉表(`crosstab`)的区别
Pandas 中透视表(pivot_table)和交叉表(crosstab)的区别 核心区别 透视表 (pivot_table) 用于对数据进行 聚合计算(如求和、均值、计数等)。支持多维度分组(行、列、甚至多层索引)。…...
Restful风格接口开发
目录 Restful Apifox 介绍 端口号8080怎么来的? 为什么要使用Apifox? Restful 如果请求方式是Post,那我就知道了要执行新增操作,要新增一个用户 如果请求方式是Put,那就代表我要修改用户 具体要对这些资源进行什么样的操…...
20250414| AI:RAG多路召回和融合重排序技术
好的!以下是对RAG(检索增强生成)中多路召回和融合重排序技术的详细解释,结合解释学习的视角,帮助你更好地理解和学习。这些技术是RAG系统的核心组成部分,决定了检索阶段的效果和最终生成答案的质量。我会尽…...
基于时间序列分解与XGBoost的交通通行时间预测方法解析
一、问题背景与数据概览 在城市交通管理系统中,准确预测道路通行时间对于智能交通调度和路径规划具有重要意义。本文基于真实道路传感器数据,构建了一个结合时间序列分解与机器学习模型的预测框架。数据源包含三个核心部分: 道路通行数据(new_gy_contest_traveltime_train…...
论文精度:HeightFormer:基于Transformer的体素高度预测在路边3D目标检测中的应用
论文地址:https://arxiv.org/pdf/2503.10777 1. 背景与问题定义 1.1 路边视觉3D检测的重要性 在自动驾驶领域,车辆端的视觉感知系统面临视角局限性(如遮挡、短距离感知)和安全挑战。相比之下,路边摄像头通过高位安装,可覆盖更广的感知范围(如交叉路口、高速公路)…...
华为手机清理大数据的方法
清理手机最大的问题是,手动和自动清理了多次,花费了很长时间,但是只腾挪出来了一点点空间,还是有很大空间无法使用,这篇文章就告诉你怎样做,以花瓣剪辑为例,如下: 删除数据ÿ…...
tcp特点+TCP的状态转换图+time_wait详解
tcp特点TCP的状态转换图time wait详解 目录 一、tcp特点解释 1.1 面向连接 1.1.1 连接建立——三次握手 1.1.2 连接释放——四次挥手 1.2 可靠的 1.2.1 应答确认 1.2.2 超时重传 1.2.3 乱序重排 1.2.4 去重 1.2.5 滑动窗口进行流量控制 1.3 流失服务(字节…...
flutter 桌面应用之窗口自定义
在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为(大小/位置)✅(基本…...
【C++】NAN相关研究
先说结论:NAN对比一切都是false INF 对INF 是true 正无穷与正无穷比较相等,正无穷与负无穷比较不相等 window linux环境下基本相同, debug release基本相同 NAN -NAN INF -INF 不做论述 // TestNan.cpp : 此文件包含 "main" 函数。…...
windows下Git安装及其IDEA配置
1.下载Git安装包 阿里镜像链接(建议从这里下载,速度很快) git-scm.com(官方网站,提供了各个平台(Windows、Mac、Linux)的安装程序) 选择版本号后,在选择此版本的不同包…...
迷你世界脚本脚本常见问题
脚本常见问题 彼得兔 更新时间: 2024-05-22 17:54:44 在查阅开发者学院中的脚本API时,若有任何问题或建议,欢迎通过问卷进行反馈!【点我填写问卷】 1.Block中的data在什么地方使用 data使用有具体需求,此处不建议开发者使用。开发者尽可能使…...
2025蓝桥杯C++ A组省赛 题解
昨天打完蓝桥杯本来想写个 p y t h o n python python A A A 组的题解,结果被队友截胡了。今天上课把 C A CA CA 组的题看了,感觉挺简单的,所以来水一篇题解。 这场 B B B 是一个爆搜, C C C 利用取余的性质比较好写&#…...
链接世界:计算机网络的核心与前沿
计算机网络引言 在数字化时代,计算机网络已经成为我们日常生活和工作中不可或缺的基础设施。从简单的局域网(LAN)到全球互联网,计算机网络将数以亿计的设备连接在一起,推动了信息交换、资源共享以及全球化的进程。 什…...
MySQL 常见存储引擎全解析:InnoDB、MyISAM、Memory 等对比与实战
一、什么是存储引擎? 存储引擎(Storage Engine)是 MySQL 中负责数据存储与管理的底层模块。不同的存储引擎负责处理表的读写、索引维护、事务支持、崩溃恢复等机制。 在创建表时可以指定使用的存储引擎: CREATE TABLE user (id…...
21天Python计划:零障碍学语法(更新完毕)
目录 序号标题链接day1Python下载和开发工具介绍https://blog.csdn.net/XiaoRungen/article/details/146583769?spm1001.2014.3001.5501day2数据类型、字符编码、文件处理https://blog.csdn.net/XiaoRungen/article/details/146603325?spm1011.2415.3001.5331day3基础语法与…...
Python中NumPy的统计运算
在数据分析和科学计算领域,Python凭借其丰富的库生态系统成为首选工具之一,而NumPy作为Python数值计算的核心库,凭借其高效的数组操作和强大的统计运算功能,广泛应用于机器学习、信号处理、统计分析等场景。本文将系统介绍NumPy在…...
SQL 解析 with as
sql的运行顺序 <select id"getTrendList" parameterType"java.util.HashMap" resultType"java.util.Map"><![CDATA[WITH-- 生成连续年份列表(当前年前8年到前1年)year_range AS (SELECT EXTRACT(YEAR FROM SYSD…...
07-算法打卡-链表-移除链表-leetcode(203)-第七天
1 题目地址 203. 移除链表元素 - 力扣(LeetCode)203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1:[https://assets.leetc…...
抓包神器,自研EtherCAT抓包工具
大家好,博主自研了一款以太网抓包神器,可以用于EtherCAT抓包。 把抓包工具接入以太网总线中,就能正常使用了。 上位机软件采用wireshark。 开启以下协议 抓包截图如下 时间戳的精度为5ns。...
五、adb常用命令
SDK路径下的 \Android\Sdk\platform-tools\adb.exe adb devices 查看连接的设备 adb shell getprop ro.build.version.release 查看系统版本 adb shell dumpsys window windows | findstr mFocusedApp 获取正在运行的app启动包名 结果为空,我不知道是不是Android…...
Java第四节:idea在debug模式夏改变变量的值
作者往期文章 Java第一节:debug如何调试程序(附带源代码)-CSDN博客 Java第二节:debug如何调试栈帧链(附带源代码)-CSDN博客 Java第三节:新手如何用idea创建java项目-CSDN博客 步骤一 在需要修改…...
Java学习手册:Java反射与注解
Java反射(Reflection)和注解(Annotation)是Java语言中两个强大的特性,它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法,而注解则提供了一种元数据形…...
21 天 Python 计划:MySQL事务四大隔离级别深度剖析
文章目录 一、事务1.1 什么是事务?1.2 事务的四大特性 二、事务并发存在的问题2.1 脏读(dirty read)2.2 不可重复读(unrepeatable read)2.3 幻读 三、事务的四大隔离级别实践3.1 读未提交(Read Uncommitted…...
IO多路复用沉浸式体验
这篇文章主要讲解一下IO多路复用常见问题,包含常见面试题,对你有帮助的话可以留个赞和关注嘛?谢谢大家支持! 1.epoll 相比于 select/poll 的优点有哪些? 高效的数据结构:epoll使用红黑树管理fd࿰…...
音视频学习(三十三):GOP详解
GOP 概念 GOP(图像组)是视频编码中一组帧的集合(按相关性分组),它从一个关键帧(I帧)开始,后面跟随若干个参考帧(P帧)和预测帧(B帧)。其结构决定了视频帧的压…...
部署YUM仓库
目录 一.YUM 1.1yum概述 1.2yum的实现 1.3yum服务的组成 1.4yum服务实现过程 1.5yum配置文件位置 二.yum相关命令 三.搭建yum仓库的方式 3.1使用HTTP方式搭建yum仓库 准备工作(服务端和客户端都需要做) 服务端 客户端 3.2使用ftp方式搭建yu…...
中位数学习(低估它了)
-----------------------------------------------------------------中位数------------------------------------------------------- 中位数有一个很好的性质:假设有一批数据,你想找一个数,使得这批数据与它差的绝对值的和最小࿰…...
音视频转换器 AV 接口静电保护方案
方案简介 音视频转换器是将音视频(AV)信号转换成其他格式或信号类型的设备或软件。 它能够实现大多数视频、音频以及图像格式之间的转换,包括但不限于 RMVB、AVI、 MP4、MOV 等常见格式,同时也支持将不同采样率、位深度、声道数…...
蓝桥杯嵌入式第十二届省赛程序设计1(超简单版)
此程序只需要会C语言数组,结构体(struct),for , if , switch(也可以用if)就能够实现。 引脚设置: 引脚配置(参照笔记): 代码部分: /* USER CODE END Header */ /* Includes ------------------…...
CSS 链接样式学习笔记
在网页设计中,链接(<a> 标签)是不可或缺的元素,通过 CSS 可以对链接进行丰富的样式设置,从而提升用户体验和页面美观度。以下是关于 CSS 链接样式的详细学习笔记。 一、链接的四种状态 链接有四种不同的状态&a…...
有ts文件却无法ts出来解决办法
一开始报错是报这个,但是我其实完全看不懂为什么 原因是这个 打开某个test就行了...
javaSE.Lambda表达式
如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式: (【参数类型 参数名称,】...) -> {代码语句, 包括返回值} 只有一行花括号{}可以省略。…...
Web渗透之文件包含漏洞
文件包含漏洞原理 1、源代码 <?php$filename $_GET[filename]; include $filename; //或include_once,require,require_onceecho "欢迎来到PHP的世界.";?> 2、利用条件 php.ini中alllow_url_fopenOn(默认开启)和allow_url_includeOff(默认关闭)要开启…...
费马引理和罗尔定理
cheer 向……欢呼,使高兴,欢呼,欢呼,愉快 前言区间平均值费马引理罗尔三步万能构造原函数的方法什么时候用罗尔定理计划拉格朗日需要记忆的不等式柯西中值定理泰勒高阶导数判断极值最后 前言 继续学习。今天争取把讲义和作业题都…...
【合新通信】浸没式液冷中低成本冷媒开发的最新进展
浸没式液冷光模块是一种结合高效散热技术与光通信的新型解决方案,主要用于数据中心、超算中心等高密度计算场景。其核心特点是通过将光模块直接浸入绝缘冷却液中(如矿物油、氟化液等),实现高效散热和节能降耗。低成本冷却液的研发…...
【开发记录】服务外包大赛记录
参加服务外包大赛的A07赛道中,最近因为频繁的DEBUG,心态爆炸 记录错误 以防止再次出现错误浪费时间。。。 2025.4.13 项目在上传图片之后 会自动刷新 没有等待后端返回 Network中的fetch /upload显示canceled. 然而这是使用了VS的live Server插件才这样&…...
智能指针之设计模式1
本文探讨一下智能指针和GOF设计模式的关系,如果按照设计模式的背后思想来分析,可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然,它们也不是严格意义上面向对象的设计模式,毕竟它们没有那么分明的类层次体系&…...
Spring Boot 中应用的设计模式
Spring Boot 中应用的设计模式详解 Spring Boot 作为 Spring 框架的扩展,广泛使用了多种经典设计模式。以下是主要设计模式及其在 Spring Boot 中的具体应用: 一、创建型模式 1. 工厂模式 (Factory Pattern) 应用场景: BeanFactory 和 Ap…...
23种GoF设计模式
GoF(Gang of Four)设计模式是由四位计算机科学家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的书籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的设计模式 目录 一、创建型模式(Cre…...
Python实例题:Python实现中文错别字高亮系统
目录 Python实例题 题目 安装依赖库 代码实现 代码解释 运行思路 注意事项 Python实例题 题目 Python实现中文错别字高亮系统 安装依赖库 在开始之前,你需要安装 pycorrector 和 rich 库。可以使用以下命令进行安装: pip install pycorrecto…...
【第三十一周】ViT 论文阅读笔记
ViT 摘要Abstract文章信息引言方法Patch EmbeddingPatch Position EmbeddingTransformer EncoderMLP Head整体架构CNN的归纳偏置 代码实现实验结果总结 摘要 本篇博客介绍了Vision Transformer(ViT),这是一种突破性的图像分类模型ÿ…...
射频(RF)静电放电防护方案
方案简介 射频(RF)是 Radio Frequency 的缩写,表示可以辐射到空间的电磁频率,频率 范围从 300kHz~300GHz 之间。射频就是射频电流,简称 RF,它是一种高频交流变化 电磁波的简称。射频天线是一…...