Go语言标准库之log和三方库zap
一、Log
1.1 logger基本使用
Go语言内置的log包实现了简单的日志服务。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用。
Fatal系列用于输出一条致命错误信息,并调用 os.Exit(1) 终止程序运行。这个函数会在打印完错误信息之后立即调用 os.Exit 退出程序。
package mainimport ("log"
)func main() {log.Println("卡卡西的日志")x := "鸣人"log.Printf("%s的日志\n", x)log.Fatalln("会触发fatal的日志")// 这里的代码不会被执行,因为程序已经在 log.Fatalln 后退出了log.Panicln("会触发panic的日志")
}
2024/05/16 23:03:24 卡卡西的日志
2024/05/16 23:03:24 鸣人的日志
2024/05/16 23:03:24 会触发fatal的日志
exit status 1
1.2 logger配置
基础的logger只提供日志的时间信息,如果需要获取更多的信息或者输出方式,可以通过进一步配置实现。
1.2.1 标准配置 log.SetFlags.SetFlags
log.SetFlags()函数用于设置日志的输出格式log.Flags()函数来获取当前日志包的配置标志,并将其打印输出。
以下是 log 包中定义的一些常用选项:
- log.Ldate:日期:2009/01/23
- log.Ltime:时间:01:23:23
- log.Lmicroseconds:微秒级时间:01:23:23.123123
- log.Llongfile:文件名和行号:/a/b/c/d.go:23
- log.Lshortfile:文件名和行号:d.go:23
- log.LUTC:使用 UTC 时间
下面在记录日志之前先设置一下logger的输出选项:
package mainimport ("fmt""log"
)func main() {log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)log.Println("卡卡西的日志")flags := log.Flags()fmt.Println("Flags:", flags)
}
输出结果
2024/05/16 23:25:39.519510 d:/go/练习/main.go:10: 卡卡西的日志
Flags: 13
1.2.2 前缀配置 log.SetPrefix 和 log.Prefix
log.SetPrefix用于设置日志输出的前缀,它接受一个字符串作为参数,这个字符串将会作为日志信息的前缀显示在每条日志的最前面。log.Prefix则是一个属性,用于获取当前日志输出的前缀。
func main() {log.SetPrefix("复制忍者:")log.Println("卡卡西")prefix := log.Prefix()fmt.Println(prefix)
}
输出结果是
复制忍者:2024/05/18 10:06:56 卡卡西
复制忍者:
1.2.3 输出位置 log.SetOutput
log.SetOutput 用于设置日志输出的目标。这个函数接受一个 io.Writer 类型的参数,将日志输出到指定的 io.Writer 实现。
func main() {file, err := os.OpenFile("logfile.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Fatal("Failed to open logfile.log", err)}defer file.Close()log.SetOutput(file)log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)log.Println("卡卡西")log.SetPrefix("复制忍者:")
}
1.3 logger对象创建
log.New 用于创建一个新的 Logger 对象。这个函数接受三个参数:一个实现了 io.Writer 接口的目标输出流、一个用于添加前缀的字符串、以及一个用于指定日志属性的标志选项。
func main() {// 创建一个新的 Logger 对象,将日志输出到标准错误输出,并添加前缀 "ERROR: "logger := log.New(os.Stderr, "ERROR: ", log.LstdFlags)// 使用新创建的 Logger 对象输出日志logger.Println("This is an error message.")
}
输出结果
ERROR: 2024/05/18 10:27:40 This is an error message.
二、第三方日志库 Zap
注意:Zap并不是Go的标准库,而是为了解决Go内置log库功能有限的问题,所引入的第三方日志库。在此处介绍Zap是为了方便与log库进行对比学习。
- Zap的优点:快、结构化,分日志级别。
Zap 日志库提供了两种类型的日志记录器:Sugared Logger 和 Logger。它们分别适用于不同的日志记录场景。
-
Sugared Logger:
- Sugared Logger 提供了结构化和格式化的日志记录功能,支持使用类似 Printf 风格的方法记录日志。
- 它使用了结构化的上下文字段,可以方便地记录关键-值对形式的日志信息。
- Sugared Logger 适合用于一般的日志记录需求,提供了更直观、易用的 API。
-
Logger:
- Logger 提供了更底层的、零分配(zero-allocation)的日志记录功能,适用于高性能、高吞吐量的日志记录需求。
- 它的 API 相对更加简洁,不支持结构化的上下文字段,但在性能方面有优势。
- Logger 适合用于需要尽量减少内存分配和提升性能的场景。
根据具体的需求和场景,可以选择使用 Zap 提供的 Sugared Logger 或 Logger 来实现相应的日志记录功能。
2.1 Logger
- 调用
zap.NewProduction()或者zap.NewDevelopment()或者zap.Example()创建了一个 Zap 日志记录器 - 通过Logger调用Info/Error等
- 程序结束前调用 logger.Sync() 来确保所有日志都被输出
zap.NewProduction():会配置 Logger 以适应生产环境的需求,例如默认会将日志输出到标准错误输出,并且会禁用堆栈跟踪等详细的调试信息,以减少对性能的影响。适合用于生产环境中记录稳定运行日志的场景。
zap.NewDevelopment():会配置 Logger 以便于开发过程中更好地跟踪和调试日志,例如会输出更详细的调试信息和堆栈跟踪。适合用于开发和调试过程中辅助定位问题、跟踪日志的场景。
zap.Example():是一个示例方法,提供了一个简单的例子,演示了如何创建 Logger 实例、记录不同级别的日志、以及如何添加结构化的上下文字段等操作。
下面通过简单的http get介绍logger的用法
package mainimport ("net/http""go.uber.org/zap"
)var logger *zap.Logger// 初始化日志记录器
func InitLogger() {logger, _ = zap.NewProduction()
}// 发送 HTTP GET 请求
func httpGet(url string){resp, err := http.Get(url)if err != nil {// 如果请求中出现错误,记录错误日志logger.Error("Error fetching url: ",zap.String("url",url),zap.Error(err))} else {// 如果请求成功,记录成功日志logger.Info("Success: ",zap.String("statusCode", resp.Status),zap.String("url", url))resp.Body.Close()}
}func main() {InitLogger()// 使用了 defer 关键字来延迟执行 logger.Sync(),以确保在程序退出前执行同步操作defer logger.Sync()httpGet("https://blog.csdn.net/Ricardo2/article/details/134253323")httpGet("www.google.com")
}
输出结果
{"level":"info","ts":1716001211.442937,"caller":"练习/main.go:26","msg":"Success: ","statusCode":"403 Forbidden","url":"https://blog.csdn.net/Ricardo2/article/details/134253323"}
{"level":"error","ts":1716001211.443463,"caller":"练习/main.go:20","msg":"Error fetching url: ","url":"www.google.com","error":"Get \"www.google.com\": unsupported protocol scheme \"\"","stacktrace":"main.httpGet\n\td:/go/练习/main.go:20\nmain.main\n\td:/go/练习/main.go:41\nruntime.main\n\tE:/goland/src/runtime/proc.go:250"}
2.2 SugaredLogger
大部分的实现基本都相同。
惟一的区别是,我们通过logger.Sugar()方法来获取一个SugaredLogger。
package mainimport ("net/http""go.uber.org/zap"
)var sugarLogger *zap.SugaredLogger// 初始化日志记录器
func InitLogger() {logger, _ := zap.NewProduction()sugarLogger = logger.Sugar()
}// 发送 HTTP GET 请求
func httpGet(url string){sugarLogger.Debugf("Trying to grt request for %s", url)resp, err := http.Get(url)if err != nil {// 如果请求中出现错误,记录错误日志sugarLogger.Error("Error fetching url: ",zap.String("url",url),zap.Error(err))} else {// 如果请求成功,记录成功日志sugarLogger.Info("Success: ",zap.String("statusCode", resp.Status),zap.String("url", url))resp.Body.Close()}
}func main() {InitLogger()// 使用了 defer 关键字来延迟执行 logger.Sync(),以确保在程序退出前执行同步操作defer sugarLogger.Sync()httpGet("https://blog.csdn.net/Ricardo2/article/details/134253323")httpGet("www.google.com")
}
输出结果
{"level":"info","ts":1716001865.691326,"caller":"练习/main.go:28","msg":"Success: {statusCode 15 0 403 Forbidden <nil>} {url 15 0 https://blog.csdn.net/Ricardo2/article/details/134253323 <nil>}"}
{"level":"error","ts":1716001865.6924412,"caller":"练习/main.go:22","msg":"Error fetching url: {url 15 0 www.google.com <nil>} {error 26 0 Get \"www.google.com\": unsupported protocol scheme \"\"}","stacktrace":"main.httpGet\n\td:/go/练习/main.go:22\nmain.main\n\td:/go/练习/main.go:43\nruntime.main\n\tE:/goland/src/runtime/proc.go:250"}
2.3 日志级别
Zap 日志库支持以下几种日志级别,可以根据不同的需求来选择合适的级别记录日志:
- Debug:
用于记录调试过程中的详细信息,通常在开发和调试阶段使用。
使用 logger.Debug() 方法记录 Debug 级别的日志。 - Info:
用于记录程序运行过程中的一般信息,例如启动信息、关键事件等。
使用 logger.Info() 方法记录 Info 级别的日志。 - Warn:
用于记录可能出现问题但不会影响程序正常运行的警告信息,例如参数使用不当、潜在的问题等。
使用 logger.Warn() 方法记录 Warn 级别的日志。 - Error:
用于记录程序中的错误信息,例如异常、错误状态等。
使用 logger.Error() 方法记录 Error 级别的日志。 - DPanic:
用于记录严重的错误,会导致程序进入恐慌状态的错误。
使用 logger.DPanic() 方法记录 DPanic 级别的日志。 - Panic:
用于记录导致程序无法继续正常运行的错误,记录后会触发程序 panic。
使用 logger.Panic() 方法记录 Panic 级别的日志。 - Fatal:
用于记录导致程序无法继续运行的严重错误,记录后会触发程序退出。
使用 logger.Fatal() 方法记录 Fatal 级别的日志。
2.4 Zap配置
2.4.1 标准配置
下面介绍如何对Zap的日志做详细的配置:
- 如何写入日志
- 日志写入到哪里
- 写入什么级别的日志
具体来说,将使用zap.New(…)方法来手动传递所有配置
func New(core zapcore.Core, options ...Option) *Logger
zapcore.Core 接口类型的实例,定义了日志记录的核心功能,包括日志级别的判断LogLevel、格式化日志消息Encoder、输出日志的目的地WriteSyncer等。
(1)Encoder:编码器(如何写入日志)。我们将使用开箱即用的NewJSONEncoder(),并使用预先设置的ProductionEncoderConfig()
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
(2)WriterSyncer :指定日志将写到哪里去。我们使用zapcore.AddSync()函数并且将打开的文件句柄传进去。通过使用 AddSync 函数,可以将一个标准的 Go io.Writer 实例(比如文件、标准输出等)包装成一个符合 Zap 日志库要求的 WriteSyncer 实例
file, _ := os.Create("./test.log")
writeSyncer := zapcore.AddSync(file)
(3)Log Level:哪种级别的日志将被写入。
下面将修改上述部分中的Logger代码,主要是重写InitLogger()方法。
package mainimport ("net/http""os""go.uber.org/zap""go.uber.org/zap/zapcore"
)var sugarLogger *zap.SugaredLoggerfunc getEncoder() zapcore.Encoder {return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}func getLogWriter() zapcore.WriteSyncer {file, _ := os.Create("./test.log")return zapcore.AddSync(file)
}// 初始化日志记录器
func InitLogger() {writeSyncer := getLogWriter()encoder := getEncoder()core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)logger := zap.New(core)sugarLogger = logger.Sugar()
}// 发送 HTTP GET 请求
func httpGet(url string) {sugarLogger.Debugf("Trying to grt request for %s", url)resp, err := http.Get(url)if err != nil {// 如果请求中出现错误,记录错误日志sugarLogger.Error("Error fetching url: ",zap.String("url", url),zap.Error(err))} else {// 如果请求成功,记录成功日志sugarLogger.Info("Success: ",zap.String("statusCode", resp.Status),zap.String("url", url))resp.Body.Close()}
}func main() {InitLogger()// 使用了 defer 关键字来延迟执行 logger.Sync(),以确保在程序退出前执行同步操作defer sugarLogger.Sync()httpGet("https://blog.csdn.net/Ricardo2/article/details/134253323")httpGet("www.google.com")
}
结果是
{"level":"debug","ts":1716607412.904807,"msg":"Trying to grt request for https://blog.csdn.net/Ricardo2/article/details/134253323"}
{"level":"info","ts":1716607415.0869148,"msg":"Success: {statusCode 15 0 200 OK <nil>} {url 15 0 https://blog.csdn.net/Ricardo2/article/details/134253323 <nil>}"}
{"level":"debug","ts":1716607415.0869148,"msg":"Trying to grt request for www.google.com"}
{"level":"error","ts":1716607415.0869148,"msg":"Error fetching url: {url 15 0 www.google.com <nil>} {error 26 0 Get \"www.google.com\": unsupported protocol scheme \"\"}"}
2.4.2 修改输出格式
NewJSONEncoder() 创建的编码器将日志事件格式化为 JSON 格式的字符串。这种格式在日志收集系统、日志分析工具等场景中通常更易于处理和解析。
NewConsoleEncoder() 创建的编码器将日志事件格式化为人类可读的文本格式,通常采用一种类似于控制台输出的格式。这种格式适合在终端中查看日志。
func getEncoder() zapcore.Encoder {return zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig())
}
结果是
1.7166081613816104e+09 debug Trying to grt request for https://blog.csdn.net/Ricardo2/article/details/134253323
1.7166081620810077e+09 info Success: {statusCode 15 0 200 OK <nil>} {url 15 0 https://blog.csdn.net/Ricardo2/article/details/134253323 <nil>}
1.7166081620810077e+09 debug Trying to grt request for www.google.com
1.7166081620815365e+09 error Error fetching url: {url 15 0 www.google.com <nil>} {error 26 0 Get "www.google.com": unsupported protocol scheme ""}
2.4.3 修改时间展示方式
首先要覆盖Encoder终默认的ProductionConfig(),进行手动配置:
- 修改时间编码器
- 在日志文件中使用大写字母记录日志级别
func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderencoderConfig.EncodeLevel = zapcore.CapitalLevelEncoderreturn zapcore.NewConsoleEncoder(encoderConfig)
}
2.4.4 增加调用者函数的信息
将在zap.New(..)函数中添加一个Option。
logger := zap.New(core, zap.AddCaller())
最后,结果是
2024-05-25T11:41:42.283+0800 DEBUG 练习/main.go:37 Trying to grt request for https://blog.csdn.net/Ricardo2/article/details/134253323
2024-05-25T11:41:43.196+0800 INFO 练习/main.go:47 Success: {statusCode 15 0 200 OK <nil>} {url 15 0 https://blog.csdn.net/Ricardo2/article/details/134253323 <nil>}
2024-05-25T11:41:43.199+0800 DEBUG 练习/main.go:37 Trying to grt request for www.google.com
2024-05-25T11:41:43.199+0800 ERROR 练习/main.go:41 Error fetching url: {url 15 0 www.google.com <nil>} {error 26 0 Get "www.google.com": unsupported protocol scheme ""}
2.4.5 将日志同时输出到文件和终端
func getLogWriter() zapcore.WriteSyncer {file, _ := os.Create("./test.log")// 利用io.MultiWriter支持文件和终端两个输出目标ws := io.MultiWriter(file, os.Stdout)return zapcore.AddSync(ws)
}
2.4.6 将err日志单独输出到文件
将ERROR级别的日志单独输出到一个名为xx.err.log的日志文件中。
func InitLogger() {encoder := getEncoder()// test.log记录全量日志logF, _ := os.Create("./test.log")c1 := zapcore.NewCore(encoder, zapcore.AddSync(logF), zapcore.DebugLevel)// test.err.log记录ERROR级别的日志errF, _ := os.Create("./test.err.log")c2 := zapcore.NewCore(encoder, zapcore.AddSync(errF), zap.ErrorLevel)// 使用NewTee将c1和c2合并到corecore := zapcore.NewTee(c1, c2)logger = zap.New(core, zap.AddCaller())
}
相关文章:
Go语言标准库之log和三方库zap
一、Log 1.1 logger基本使用 Go语言内置的log包实现了简单的日志服务。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来…...
Linux:进程终止和进程替换
Linux:Linux:进程终止和进程替换 一、进程终止1.1 进程退出场景和创建退出方式 1.2 exit 和 _exit区别二、进程程序替换2.1 进程替换函数2.2 函数解释及命名解释函数解释命名解释 2.3 单进程程序替换(无子进程)2.3.1 带l函数进程替…...
使用Java实现异步消息处理与队列消费
使用Java实现异步消息处理与队列消费 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代软件系统中,处理异步消息和队列消费是常见的需求。通过…...
使用C++实现ATM系统,谈谈思路及代码实现
🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…...
相机光学(二十四)——CRA角度
CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系(一) 2.芯片CRA角度与镜头选型的匹配关…...
python函数和c的区别有哪些
Python有很多内置函数(build in function),不需要写头文件,Python还有很多强大的模块,需要时导入便可。C语言在这一点上远不及Python,大多时候都需要自己手动实现。 C语言中的函数,有着严格的顺…...
速看!这主食冻干评测极可能被商家恶意举报~PR、希喂和SC真实测评
我是一名专注于宠物健康的营养师,日常大部分时间都在与猫咪和狗狗为伴,对它们入店时的身体状况往往能迅速做出初步判断。当前,多数家养猫咪面临的肥胖和肝损伤问题尤为突出,尽管医疗干预能缓解病情,但要从根本上解决还…...
股票数据分析(K线图、均值图、MACD图、RSI图)--股票日数据
数据 数据是上证指数日行情数据,股票代码000002.sz,原始数据shdata示例如下: 读取数据: import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime imp…...
重写equals()方法为什么同时要重写hashcode()
equals()方法 equals()方法是Object类中的一个方法,在Object类中,equals等同于。 在不同的类中,往往会对equals()按需求进行重写。重写的目的都是:用于比较两个对象是否 "相等"。如果两个对象的内容相同,那…...
安全及应用(更新)
一、账号安全 1.1系统帐号清理 #查看/sbin/nologin结尾的文件并统计 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登录的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改变…...
Hadoop权威指南-读书笔记-03-Hadoop分布式文件系统
Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊 第三章 Hadoop分布式文件系统 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分…...
Rust入门实战 编写Minecraft启动器#2建立资源模型
首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息,之后我们需要将json文件解析成这几个结构体,所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…...
小白学C++(第一天)基础入门
温馨提醒:本篇文章,请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字,使用格式格式如下: namespace 空间名 { } 其中{ }内的命名空间的成员,可以定义…...
谷歌正在试行人脸识别办公室安全系统
内容提要: 🧿据美国消费者新闻与商业频道 CNBC 获悉,谷歌正在为其企业园区安全测试面部追踪技术。 🧿测试最初在华盛顿州柯克兰的一间办公室进行。 🧿一份内部文件称,谷歌的安全和弹性服务 (GSRS) 团队将…...
【CSS01】CSS概述,使用样式的必要性,CSS语法及选择器
文章目录 一、什么是样式二、使用样式的必要性三、使用样式的几种方式四、CSS基本语法:五、CSS的注释六、CSS选择器——重点相关单词 一、什么是样式 概念: Cascade [kˈskeɪd] Style Sheet [ʃiːt] 级联样式单/表,层叠样式表 CSS有化腐…...
PostgreSQL的pg_bulkload工具
PostgreSQL的pg_bulkload工具 pg_bulkload 是一个针对 PostgreSQL 提供高性能批量数据加载的工具。相较于内置的 COPY 命令,pg_bulkload 更加灵活并且在许多情况下性能更高。它支持数据的强制加载、数据过滤、数据转换以及错误处理等多种功能,非常适合需…...
【Java伴学笔记】Day-01 命令行|环境|编译解释运行|Java的相关分支|Java的特性|字面量
一、关于命令行 图形化界面的缺点 需要加载图片等一系列资源 效率较低 命令行 CMDMicrosoft Learn-CMDWindows CMD常用命令大全(值得收藏) 二、环境 什么是JDK JDK是Java Development Kit的缩写,意为Java开发工具包。它是一个用于开发Java应用…...
如何使用Vue3创建在线三维模型展示?
本文由ScriptEcho平台提供技术支持 项目地址:传送门 代码相关的技术博客 代码应用场景介绍 本段代码使用 RoughJS 库在 HTML5 Canvas 上创建了手绘风格的图像,展示了 RoughJS 库的强大功能,可用于创建具有有机手绘外观的图形。 代码基本…...
使用ndoe实现自动化完成增删改查接口
使用ndoe实现自动化完成增删改查接口 最近工作内容比较繁琐,手里需要开发的项目需求比较多,常常在多个项目之间来回切换,有时候某些分支都不知道自己开发了什么、做了哪些需求, 使用手写笔记的方式去记录分支到头来也是眼花缭乱&a…...
排序 -- 手撕归并排序(递归和非递归写法)
一、基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
