当前位置: 首页 > article >正文

Go语言的JSON处理技巧

Go语言的JSON处理技巧JSON的重要性JSONJavaScript Object Notation是一种轻量级的数据交换格式广泛应用于Web应用、API通信、配置文件等场景。在Go语言中JSON处理是一项基本技能因为API通信大多数RESTful API使用JSON作为数据格式配置文件很多应用使用JSON作为配置文件格式数据存储JSON是一种常见的数据存储格式跨语言通信JSON可以在不同编程语言之间轻松交换数据Go语言的标准库encoding/json提供了强大的JSON处理功能本文将详细介绍JSON处理的各种技巧和最佳实践。基本的JSON序列化结构体转JSONpackage main import ( encoding/json fmt ) type Person struct { Name string json:name Age int json:age Email string json:email Address string json:address,omitempty } func main() { person : Person{ Name: Alice, Age: 30, Email: aliceexample.com, Address: , // 空值会被omitempty忽略 } // 序列化为JSON data, err : json.Marshal(person) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(JSON: %s\n, data) }切片和映射转JSONpackage main import ( encoding/json fmt ) func main() { // 切片转JSON numbers : []int{1, 2, 3, 4, 5} data, err : json.Marshal(numbers) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(切片JSON: %s\n, data) // 映射转JSON person : map[string]interface{}{ name: Bob, age: 25, email: bobexample.com, } data, err json.Marshal(person) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(映射JSON: %s\n, data) }美化输出package main import ( encoding/json fmt ) func main() { person : map[string]interface{}{ name: Alice, age: 30, email: aliceexample.com, address: map[string]string{ city: Beijing, street: Main St, }, } // 美化输出 data, err : json.MarshalIndent(person, , ) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(美化JSON: %s\n, data) }基本的JSON反序列化JSON转结构体package main import ( encoding/json fmt ) type Person struct { Name string json:name Age int json:age Email string json:email Address string json:address,omitempty } func main() { jsonStr : {name:Alice,age:30,email:aliceexample.com} var person Person err : json.Unmarshal([]byte(jsonStr), person) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } fmt.Printf(姓名: %s\n, person.Name) fmt.Printf(年龄: %d\n, person.Age) fmt.Printf(邮箱: %s\n, person.Email) fmt.Printf(地址: %s\n, person.Address) }JSON转映射package main import ( encoding/json fmt ) func main() { jsonStr : {name:Bob,age:25,email:bobexample.com} var person map[string]interface{} err : json.Unmarshal([]byte(jsonStr), person) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } fmt.Printf(姓名: %v\n, person[name]) fmt.Printf(年龄: %v\n, person[age]) fmt.Printf(邮箱: %v\n, person[email]) }JSON转切片package main import ( encoding/json fmt ) func main() { jsonStr : [1, 2, 3, 4, 5] var numbers []int err : json.Unmarshal([]byte(jsonStr), numbers) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } fmt.Printf(切片: %v\n, numbers) }高级JSON处理技巧自定义字段标签package main import ( encoding/json fmt ) type Person struct { // 字段名映射 FirstName string json:first_name // 忽略空值 LastName string json:last_name,omitempty // 忽略字段 Age int json:- // 嵌套结构体 Address struct { City string json:city Street string json:street } json:address } func main() { person : Person{ FirstName: John, LastName: , // 会被忽略 Age: 30, // 会被忽略 Address: struct { City string json:city Street string json:street }{ City: New York, Street: Broadway, }, } data, err : json.Marshal(person) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(JSON: %s\n, data) }处理嵌套JSONpackage main import ( encoding/json fmt ) type Address struct { City string json:city Street string json:street ZipCode string json:zip_code } type Person struct { Name string json:name Age int json:age Address Address json:address } func main() { jsonStr : { name: Alice, age: 30, address: { city: Beijing, street: Main St, zip_code: 100000 } } var person Person err : json.Unmarshal([]byte(jsonStr), person) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } fmt.Printf(姓名: %s\n, person.Name) fmt.Printf(年龄: %d\n, person.Age) fmt.Printf(城市: %s\n, person.Address.City) fmt.Printf(街道: %s\n, person.Address.Street) fmt.Printf(邮编: %s\n, person.Address.ZipCode) }处理JSON数组package main import ( encoding/json fmt ) type Person struct { Name string json:name Age int json:age } func main() { jsonStr : [ {name:Alice,age:30}, {name:Bob,age:25}, {name:Charlie,age:35} ] var people []Person err : json.Unmarshal([]byte(jsonStr), people) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } for i, person : range people { fmt.Printf(人物 %d: 姓名%s, 年龄%d\n, i1, person.Name, person.Age) } }处理复杂类型接口类型package main import ( encoding/json fmt ) type Response struct { Status string json:status Message string json:message Data interface{} json:data } func main() { // 数据为字符串 resp1 : Response{ Status: success, Message: 操作成功, Data: Hello, World!, } data, err : json.Marshal(resp1) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(响应1: %s\n, data) // 数据为结构体 resp2 : Response{ Status: success, Message: 操作成功, Data: struct { Name string json:name Age int json:age }{ Name: Alice, Age: 30, }, } data, err json.Marshal(resp2) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(响应2: %s\n, data) }时间类型package main import ( encoding/json fmt time ) type Event struct { Title string json:title StartTime time.Time json:start_time EndTime time.Time json:end_time } func main() { event : Event{ Title: 会议, StartTime: time.Now(), EndTime: time.Now().Add(2 * time.Hour), } data, err : json.Marshal(event) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(事件JSON: %s\n, data) // 反序列化 var event2 Event err json.Unmarshal(data, event2) if err ! nil { fmt.Printf(反序列化失败: %v\n, err) return } fmt.Printf(标题: %s\n, event2.Title) fmt.Printf(开始时间: %s\n, event2.StartTime) fmt.Printf(结束时间: %s\n, event2.EndTime) }自定义JSON序列化package main import ( encoding/json fmt time ) // 自定义时间类型 type CustomTime time.Time // 实现Marshaler接口 func (ct CustomTime) MarshalJSON() ([]byte, error) { // 格式化时间为ISO8601格式 return json.Marshal(time.Time(ct).Format(time.RFC3339)) } // 实现Unmarshaler接口 func (ct *CustomTime) UnmarshalJSON(data []byte) error { var timeStr string if err : json.Unmarshal(data, timeStr); err ! nil { return err } t, err : time.Parse(time.RFC3339, timeStr) if err ! nil { return err } *ct CustomTime(t) return nil } type Event struct { Title string json:title StartTime CustomTime json:start_time EndTime CustomTime json:end_time } func main() { event : Event{ Title: 会议, StartTime: CustomTime(time.Now()), EndTime: CustomTime(time.Now().Add(2 * time.Hour)), } data, err : json.Marshal(event) if err ! nil { fmt.Printf(序列化失败: %v\n, err) return } fmt.Printf(事件JSON: %s\n, data) }处理JSON错误常见错误package main import ( encoding/json fmt ) type Person struct { Name string json:name Age int json:age } func main() { // 错误1: 类型不匹配 jsonStr1 : {name:Alice,age:30} // age应该是数字 var person1 Person err : json.Unmarshal([]byte(jsonStr1), person1) if err ! nil { fmt.Printf(错误1: %v\n, err) } // 错误2: 缺少必要字段 jsonStr2 : {name:Bob} // 缺少age字段 var person2 Person err json.Unmarshal([]byte(jsonStr2), person2) if err ! nil { fmt.Printf(错误2: %v\n, err) } else { fmt.Printf(person2: %v\n, person2) // age会被设置为0 } // 错误3: JSON格式错误 jsonStr3 : {name:Charlie, age:35 // 缺少结束括号 var person3 Person err json.Unmarshal([]byte(jsonStr3), person3) if err ! nil { fmt.Printf(错误3: %v\n, err) } }错误处理策略package main import ( encoding/json fmt ) type Person struct { Name string json:name binding:required Age int json:age binding:required,min1,max150 } func unmarshalWithValidation(data []byte, v interface{}) error { if err : json.Unmarshal(data, v); err ! nil { return fmt.Errorf(JSON格式错误: %w, err) } // 这里可以添加额外的验证逻辑 return nil } func main() { jsonStr : {name:Alice,age:30} var person Person if err : unmarshalWithValidation([]byte(jsonStr), person); err ! nil { fmt.Printf(处理失败: %v\n, err) return } fmt.Printf(成功: %v\n, person) }JSON处理的最佳实践结构体设计使用适当的字段标签使用json:标签控制JSON字段名和行为使用omitempty忽略空值减少JSON大小使用-忽略字段对于不需要序列化的字段使用-标签合理使用嵌套结构体将相关字段组织成嵌套结构体性能优化使用json.RawMessage延迟解析不需要立即使用的JSON数据使用json.Encoder和json.Decoder对于大JSON数据使用流式处理缓存常用的JSON数据避免重复序列化使用sync.Pool减少内存分配package main import ( encoding/json fmt strings ) func main() { // 使用Encoder和Decoder data : {name:Alice,age:30,email:aliceexample.com} reader : strings.NewReader(data) var person map[string]interface{} decoder : json.NewDecoder(reader) if err : decoder.Decode(person); err ! nil { fmt.Printf(解码失败: %v\n, err) return } fmt.Printf(解码结果: %v\n, person) // 使用Encoder var builder strings.Builder encoder : json.NewEncoder(builder) if err : encoder.Encode(person); err ! nil { fmt.Printf(编码失败: %v\n, err) return } fmt.Printf(编码结果: %s\n, builder.String()) }安全性限制JSON大小防止JSON炸弹攻击验证输入对JSON输入进行验证防止注入攻击使用强类型避免使用interface{}导致的类型断言错误处理敏感数据避免序列化敏感信息package main import ( encoding/json fmt io net/http ) func handleRequest(w http.ResponseWriter, r *http.Request) { // 限制请求体大小 r.Body http.MaxBytesReader(w, r.Body, 120) // 1MB var request struct { Username string json:username Password string json:password } decoder : json.NewDecoder(r.Body) if err : decoder.Decode(request); err ! nil { http.Error(w, 无效的请求, http.StatusBadRequest) return } // 验证输入 if request.Username || request.Password { http.Error(w, 用户名和密码不能为空, http.StatusBadRequest) return } // 处理请求... fmt.Fprintf(w, 请求处理成功\n) } func main() { http.HandleFunc(/login, handleRequest) fmt.Println(服务器启动在 :8080) http.ListenAndServe(:8080, nil) }实际应用场景配置文件package main import ( encoding/json fmt os ) type Config struct { Server struct { Host string json:host Port int json:port } json:server Database struct { Host string json:host Port int json:port User string json:user Password string json:password DBName string json:dbname } json:database Log struct { Level string json:level Path string json:path } json:log } func loadConfig(filename string) (*Config, error) { data, err : os.ReadFile(filename) if err ! nil { return nil, fmt.Errorf(读取配置文件失败: %w, err) } var config Config if err : json.Unmarshal(data, config); err ! nil { return nil, fmt.Errorf(解析配置文件失败: %w, err) } return config, nil } func main() { config, err : loadConfig(config.json) if err ! nil { fmt.Printf(加载配置失败: %v\n, err) return } fmt.Printf(服务器: %s:%d\n, config.Server.Host, config.Server.Port) fmt.Printf(数据库: %s:%d\n, config.Database.Host, config.Database.Port) fmt.Printf(日志级别: %s\n, config.Log.Level) }API通信package main import ( encoding/json fmt io net/http ) type User struct { ID int json:id Name string json:name Email string json:email } type Response struct { Status string json:status Message string json:message Data interface{} json:data,omitempty Error string json:error,omitempty } func getUser(w http.ResponseWriter, r *http.Request) { // 模拟数据库查询 user : User{ ID: 1, Name: Alice, Email: aliceexample.com, } response : Response{ Status: success, Message: 获取用户成功, Data: user, } w.Header().Set(Content-Type, application/json) if err : json.NewEncoder(w).Encode(response); err ! nil { http.Error(w, 服务器错误, http.StatusInternalServerError) return } } func createUser(w http.ResponseWriter, r *http.Request) { var user User if err : json.NewDecoder(r.Body).Decode(user); err ! nil { response : Response{ Status: error, Message: 无效的请求数据, Error: err.Error(), } w.Header().Set(Content-Type, application/json) w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(response) return } // 模拟创建用户 user.ID 2 response : Response{ Status: success, Message: 创建用户成功, Data: user, } w.Header().Set(Content-Type, application/json) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(response) } func main() { http.HandleFunc(/api/users/1, getUser) http.HandleFunc(/api/users, createUser) fmt.Println(服务器启动在 :8080) http.ListenAndServe(:8080, nil) }数据存储package main import ( encoding/json fmt os ) type User struct { ID int json:id Name string json:name Email string json:email } type UserStore struct { users []User file string } func NewUserStore(file string) (*UserStore, error) { store : UserStore{ file: file, } // 加载数据 if err : store.Load(); err ! nil { return nil, err } return store, nil } func (s *UserStore) Load() error { data, err : os.ReadFile(s.file) if err ! nil { if os.IsNotExist(err) { s.users []User{} return nil } return err } return json.Unmarshal(data, s.users) } func (s *UserStore) Save() error { data, err : json.MarshalIndent(s.users, , ) if err ! nil { return err } return os.WriteFile(s.file, data, 0644) } func (s *UserStore) Add(user User) error { s.users append(s.users, user) return s.Save() } func (s *UserStore) GetAll() []User { return s.users } func main() { store, err : NewUserStore(users.json) if err ! nil { fmt.Printf(创建存储失败: %v\n, err) return } // 添加用户 user : User{ ID: 1, Name: Alice, Email: aliceexample.com, } if err : store.Add(user); err ! nil { fmt.Printf(添加用户失败: %v\n, err) return } // 获取所有用户 users : store.GetAll() fmt.Printf(所有用户: %v\n, users) }总结Go语言的JSON处理功能非常强大通过标准库encoding/json可以轻松实现JSON的序列化和反序列化。本文介绍了基本的JSON序列化和反序列化高级JSON处理技巧如自定义字段标签、处理嵌套JSON、处理JSON数组复杂类型的处理如接口类型、时间类型、自定义序列化JSON错误处理策略JSON处理的最佳实践包括结构体设计、性能优化和安全性实际应用场景如配置文件、API通信和数据存储掌握这些技巧你可以更加高效地处理JSON数据构建更加健壮的Go应用程序。在实际开发中根据具体需求选择合适的JSON处理方法将有助于提高代码的质量和性能。

相关文章:

Go语言的JSON处理技巧

Go语言的JSON处理技巧 JSON的重要性 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用、API通信、配置文件等场景。在Go语言中,JSON处理是一项基本技能,因为: API通信&am…...

Go语言的Context上下文管理

Go语言的Context上下文管理 Context的概念 Context(上下文)是Go语言中一个非常重要的包,它提供了一种在goroutine之间传递请求范围的值、取消信号和截止时间的方法。Context在处理HTTP请求、数据库操作、RPC调用等场景中非常有用。 Context的…...

基于GEC6818的牛棚智能监控系统设计与实现

1. 项目背景与需求分析现代畜牧业正经历着从传统人工管理向智能化、自动化转型的关键阶段。作为一名长期从事嵌入式系统开发的工程师,我曾参与过多个农业物联网项目,深刻理解养殖环境监控对牲畜健康和生产效率的影响。牛棚作为奶牛日常生活的主要场所&am…...

STM32智能农业大棚监控系统开发实战

1. 项目概述这个基于STM32F103C8T6的智能农业大棚监控系统,是我去年为一个农业科技公司开发的物联网解决方案。传统大棚管理最大的痛点就是依赖人工经验,农户需要频繁进出大棚检查温湿度、土壤墒情,不仅效率低下,还经常错过最佳调…...

python IntEnum

# 聊聊Python里的IntEnum:给常量一个体面的身份 在Python里处理常量或者状态码的时候,很多人习惯直接用数字或者字符串。比如写个status 1表示成功,status 0表示失败。刚开始这么写挺方便的,但项目稍微大一点,问题就…...

AViShaWiFi:ESP8266/ESP32轻量级WiFi与HTTPS通信封装库

1. 项目概述AViShaWiFi 是一款面向 ESP8266 和 ESP32 平台的轻量级 WiFi 连接与网络通信封装库,其核心设计目标是降低嵌入式设备接入 Wi-Fi 网络及发起 HTTP/HTTPS 请求的工程门槛。该库并非从零实现 TCP/IP 协议栈或 TLS 加密层,而是深度封装 Arduino C…...

Qt框架打造轻量级串口调试助手教程

1. 项目概述作为一名嵌入式开发者,串口通信是我们日常工作中最常用的调试手段之一。市面上的串口调试助手虽然功能丰富,但往往存在各种限制:要么功能过于复杂臃肿,要么缺少某些特定功能。今天,我将分享如何使用Qt框架从…...

PG25664CG车载显示驱动深度解析:ASIL-B级TFT-LCD驱动架构与DSI/LVDS移植实践

PG25664CG 是一款专为大众汽车集团(Volkswagen Group)CARIAD 软件平台定制的嵌入式 TFT-LCD 显示驱动解决方案,面向车载信息娱乐系统(IVI)、数字仪表盘(Digital Cluster)及 HUD 控制单元等高可靠…...

HunyuanVideo-Foley开源大模型实战:基于Transformers/Accelerate推理优化

HunyuanVideo-Foley开源大模型实战:基于Transformers/Accelerate推理优化 1. 环境准备与快速部署 HunyuanVideo-Foley是一个强大的视频生成与音效生成模型,本教程将指导您如何在RTX 4090D 24GB显存的硬件环境下快速部署和运行该模型。 1.1 硬件要求检…...

PWM技术原理与应用全解析

1. PWM技术基础解析脉冲宽度调制(PWM)作为现代电力电子领域的核心技术之一,其重要性不亚于电路设计中的"ABC"。我在工业自动化领域工作十年间,从伺服驱动器到开关电源,PWM技术无处不在。理解PWM的本质&#…...

如何永久保存你的数字生活记忆:WeChatMsg数据守护终极指南

如何永久保存你的数字生活记忆:WeChatMsg数据守护终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

中兴BAV系列机顶盒WiFi天线改造记:从合盖信号差到外壳开孔外置

一、问题背景1.1 设备信息本文涉及的主角是中兴BAV系列机顶盒(运营商定制型号,如ZXV10 BAV/BAV2/BAV3等)。这款机顶盒搭载的是中兴微电子自主研发的SoC芯片——很可能是ZX296716(四核Cortex-A53,主频2.0GHz&#xff09…...

超实用指南:3步打造可移植版waifu2x-caffe

超实用指南:3步打造可移植版waifu2x-caffe 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 🌱 工具价值解析:为什么选择可移植版? waifu2x-caffe作为基于Ca…...

从魔兽团本到元宇宙:一个老玩家关于游戏终极形态的思考

前言这是一场跨越数日的对话。始于一位老玩家对当下游戏的困惑,终于一次关于宇宙递归的哲学探讨。如果你也曾怀念那个和兄弟一起通宵开荒的夜晚,如果你也对满屏的抽卡、648、限定池感到疲惫,如果你隐约觉得游戏不应该只是这样——那么这篇文章…...

Python flask django高校毕业生公职资讯系统 考公辅导系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计考公辅导核心功能后台管理功能技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块设计 用户管理…...

LeetCode 92. Reverse Linked List II 题解

LeetCode 92. Reverse Linked List II 题解 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…...

企业SEO优化与个人SEO优化有什么不同_外部链接建设在SEO优化中扮演什么角色

企业SEO优化与个人SEO优化的不同 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为企业和个人提升在线曝光度和吸引流量的关键策略。企业SEO优化与个人SEO优化在策略、目标和实施上存在显著差异。了解这些不同是制定有效优化计划的重要一步。 企业…...

STM32开发必备的C语言核心技巧与实战解析

1. STM32开发中的C语言核心知识点解析作为一名嵌入式开发者&#xff0c;我经常遇到初学者询问如何快速掌握STM32开发所需的C语言知识。今天我就结合自己多年的实战经验&#xff0c;整理出一份STM32开发中最关键的C语言知识点指南。这些内容不仅适合初学者系统学习&#xff0c;也…...

QEi编码器接口原理与工业级抗干扰实战指南

1. 编码器&#xff08;Encoder&#xff09;QEi模块技术深度解析1.1 概述&#xff1a;为何QEi是嵌入式运动控制的底层基石在电机驱动、机器人关节反馈、精密定位平台等实时运动控制系统中&#xff0c;正交编码器&#xff08;Quadrature Encoder&#xff09;是最核心的位置与速度…...

mui-datatables 高级定制:如何创建完全自定义的数据表格组件

mui-datatables 高级定制&#xff1a;如何创建完全自定义的数据表格组件 【免费下载链接】mui-datatables Datatables for React using Material-UI - https://www.material-ui-datatables.com 项目地址: https://gitcode.com/gh_mirrors/mu/mui-datatables mui-datatab…...

STM32H7 USB复合设备库:CDC+MSC+SDMMC一体化固件

1. 项目概述 usb_composite 是一款面向 STM32H7 系列微控制器&#xff08;已验证 H743、H750&#xff09;的即插即用型 USB 复合设备固件库&#xff0c;基于 TinyUSB 0.15.0 构建。其核心目标是将 CDC&#xff08;通信设备类&#xff09;、MSC&#xff08;大容量存储类&#…...

[具身智能-221]:OpenCV以及在具身智能中的应用

OpenCV&#xff08;开源计算机视觉库&#xff09;在具身智能&#xff08;Embodied AI&#xff09;中扮演着“视觉皮层”和“基础感知工具包”的角色。虽然现代具身智能的核心决策往往依赖于深度学习框架&#xff08;如PyTorch、TensorFlow&#xff09;和大型模型&#xff0c;但…...

M5ROTATE8库详解:8路旋转编码器I²C驱动与固件V2优化

1. 项目概述M5ROTATE8 是一款专为 M5Stack 生态中M5Unit-8Encoder&#xff08;官方型号名&#xff1a;8ROTATE&#xff09;模块设计的 Arduino C 库。该模块集成了8 路独立旋转编码器&#xff08;Rotary Encoder&#xff09;、8 个独立按键&#xff08;Push Button&#xff09;…...

ATmega328P ADC底层控制库:精度、功耗与实时性深度优化

1. 项目概述AnalogControlPanel&#xff08;ACP&#xff09;是一个专为ATmega328P系列Arduino平台&#xff08;Uno、Nano、Pro Mini&#xff09;设计的底层ADC控制库。它并非替代analogRead()的简易封装&#xff0c;而是一套面向嵌入式工程师的、对AVR片上模数转换器&#xff0…...

C语言指针核心概念与安全实践指南

1. 指针变量基础概念解析指针是C语言中最强大也最容易让人困惑的特性之一。理解指针的关键在于区分指针变量本身和它所指向的内存空间。让我们从一个简单的例子开始&#xff1a;int a 42; int *ptr &a;这里&#xff0c;ptr是一个指针变量&#xff0c;它存储的是变量a的地…...

毕设日志26.4.4(2):ds3231画板细节,中断引脚接法,去耦电容

Q&#xff1a;INT/SQW 上拉电阻 4.7kΩ&#xff08;如果需要使用该引脚&#xff09;&#xff0c;漏极开路输出需要上拉。意思是说&#xff0c;其内部是漏极开路输出所以需要上拉电阻&#xff1f;以及&#xff0c;我要把这个用作中断引脚&#xff0c;在引脚和GPIO口之间还要怎…...

毕设日志26.4.4(1):画原理图,画板

一个demo跑通了&#xff0c;画板有两种选择。一种是画核心板底板&#xff0c;就是在地板上集成外围电路和插座&#xff0c;然后再将开发板插在插座上。另一种是画一体板&#xff0c;如名字&#xff0c;就是所有东西都集成在板子上。于是&#xff0c;博主作为新手&#xff0c;很…...

得意黑Smiley Sans字体高效部署实战指南

得意黑Smiley Sans字体高效部署实战指南 【免费下载链接】smiley-sans 得意黑 Smiley Sans&#xff1a;一款在人文观感和几何特征中寻找平衡的中文黑体 项目地址: https://gitcode.com/gh_mirrors/smi/smiley-sans 作为一款在人文观感和几何特征中寻找平衡的现代中文黑体…...

5分钟彻底解决Windows效率难题:PowerToys中文版让系统增强零门槛上手

5分钟彻底解决Windows效率难题&#xff1a;PowerToys中文版让系统增强零门槛上手 【免费下载链接】PowerToys-CN PowerToys Simplified Chinese Translation 微软增强工具箱 自制汉化 项目地址: https://gitcode.com/gh_mirrors/po/PowerToys-CN 你是否曾因Windows系统功…...

FreeRTOS嵌入式实时操作系统工程实践指南

1. FreeRTOS&#xff1a;嵌入式实时操作系统的工程实践指南FreeRTOS 是一个专为微控制器和小型嵌入式系统设计的开源实时操作系统&#xff08;Real-Time Operating System, RTOS&#xff09;&#xff0c;其核心代码以 MIT 许可证发布&#xff0c;源码完全开放、无商业授权限制&…...