- 博客(89)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Go defer 原理剖析篇 — 深度 defer 的基础知识前提:理解函数调用
文章目录地址空间函数栈帧栈帧的划定函数调用函数返回举个例子总结更多干货:关注公众号 奇伢云存储本篇文章是深入剖析 golang 的 defer 的基础知识准备,如果要完全理解 defer ,避免踩坑,这个章节的基础知识必不可少。我们先复习一个最基础的知识 —— 函数调用。这个对理解 defer 在函数里的行为必不可少。那么,当你看到一个函数调用的语句你能回忆起多少知识点呢?地址空间下图是一个典型的操作系统的地址空间示意图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(i
2021-02-17 20:48:27
294
原创 Go 并发编程 — 结构体多字段更新的原子操作
[toc]多字段更新?并发编程中,原子更新多个字段是常见的需求。举个例子,有一个 struct Person 的结构体,里面有两个字段。我们先更新 Person.name,再更新 Person.age ,这是两个步骤,但我们必须保证原子性。有童鞋可能奇怪了,为什么要保证原子性?我们以一个示例程序开端,公用内存简化成一个全局变量,开 10 个并发协程去更新。你猜最后的结果是啥?package mainimport ( "fmt" "sync&quo
2021-08-14 22:25:30
886
1
原创 自制文件系统 —— 01 什么文件系统
文章目录前情提要探索文件系统查看现有文件系统实例查看目录挂载的文件系统用量查看文件系统挂载配置查看内核支持的文件系统开发文件系统为什么难?内核文件系统FUSE 文件系统总结前情提要原创不易,欢迎关注,公众号:奇伢云存储来一个硬核系列,得益于 Linux 一切皆文件的哲学,把文件系统玩转的飞起。文件系统所有人都听过,都用过,但是就很少有人深究。对于文件系统,大家的态度可能是两个极端,要么就是觉得好深奥,好牛,你竟然懂这玩意!要么就是,文件系统是什么鬼?不就是那个。。。我在 Linux 用过无数次的
2021-06-07 21:56:35
271
原创 Linus 命名 [冰封荒原] 版 Linux 内核的思考
文章目录奇闻轶事什么是单点故障?怎么解决?问题来了怎么保持一致性?一致性的分类Write-All-Read-OneQuorumQuorum 定义如何确定最新递交的值?Raft 算法总结喜欢就关注我吧。公众号:奇伢云存储;奇闻轶事Linux 作者 Linus Torvalds 在 5.12 合并窗口开启两周之后发布了 Kernel 5.12-rc1 版本,在邮件列表里 Linus Torvalds 爆料自己经历了六天没有电的生活。“So I was actually without electr
2021-03-14 10:49:29
304
3
原创 Go 并发编程 — 深入浅出 sync.Pool ,围观最全的使用姿势,理解最深刻的原理
更多干货,关注公众号:奇伢云存储文章目录使用姿势初始化 Pool 实例 New申请对象 Get释放对象 Put思考为什么用 Pool,而不是在运行的时候直接实例化对象呢?`sync.Pool` 是线程安全的吗?为什么 `sync.Pool` 不适合用于像 socket 长连接或数据库连接池?总结Go 并发相关库 sync 里面有一个有趣的 package Pool,sync.Pool 是个有趣的库,用很少的代码实现了很巧的功能。第一眼看到 Pool 这个名字,就让人想到池子,元素池化是常用的性能优.
2021-02-22 23:56:15
498
原创 Go 1.16 正式发布,支持 macOS ARM64 架构
文章目录多平台指令的支持Darwin and iOSNetBSDOpenBSD386RISC-V工具链Go CommandCgoVet运行时编译器链接器标准库总结更多干货:关注公众号 奇伢云存储Go 1.16 距离上个 Go 1.15 版本差不多 6 个月,所以这个版本迭代速度还是挺快的。本次更新没有对语言本身做变更,主要更新的是工具链,运行时( runtime ),标准库的一些功能实现和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承诺。相关地址:更新公告地址:https://go
2021-02-17 20:50:46
1560
原创 Go defer 原理剖析篇 — 深度解密 defer 原理,究竟背着程序猿做了多少事情
文章目录编译器怎么编译 defer`struct _defer` 数据结构`struct _defer` 内存分配栈上分配 `deferprocStack`堆上分配 `deferproc`执行 defer 函数链( `deferreturn` )jmpdeferdefer 怎么传递参数?预计算参数defered 的参数准备一个函数多个 defer 语句的时候,会发生什么?defer 和 return 返回值运行顺序究竟是怎样的?函数的调用过程return 之后是先返回值还是先执行 defer 函数?总结
2021-02-17 20:49:47
665
1
原创 Go defer 原理剖析篇 — 搞懂 golang defer 所有的使用姿势
文章目录defer 的特性延迟调用LIFO作用域异常场景使用姿势并发同步锁场景资源释放panic-recover总结更多干货:关注公众号 奇伢云存储Golang 的 defer 是什么?通俗来讲就是延迟调用。defer 会在当前函数返回之前执行 defer 注册的函数。比如 defer func_x( ) 这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。笔者使用一段时间 Golang 之后,对 Golang defer 的理解认为作用有两点
2021-02-17 20:47:00
813
原创 深度剖析 golang 的内存可见性
文章目录背景什么是内存可见性 ?多级缓存设计编译优化和 cpu 乱序执行什么是 happens-before ?为什么要有 happens-before 规则?C 语言的内存可见性`volatile` 关键字memory barrierGolang 的 happens-beforeInitializationGoroutine creationGoroutine destructionChannel communiactionLocksOnce错误的例子总结更多干货:关注公众号 奇伢云存储背景Go
2021-02-17 20:44:32
1774
1
原创 Go chan 为啥没有判断 close 的接口?
文章目录Go 为什么没有判断 close 的接口?关闭 channel 究竟做了什么?`closechan`一个判断 chan 是否 close 的函数思考方法一:通过“写”chan 实现思考方法二:通过“读”chan 实现chan close 原则其实并不需要 `isChanClose` 函数 !!!怎么优雅关闭 chan ?方法一:panic-recover方法二:sync.Once方法三:事件同步来解决总结更多干货,关注公众号奇伢云存储Go 为什么没有判断 close 的接口?相信大家初学
2021-02-17 20:38:37
359
原创 Go 最细节篇 — 空结构体是什么?
公众号:奇伢云存储文章目录背景原理解密特殊变量:zerobase内存管理特殊处理定义的各种姿势原生定义重定义类型匿名嵌套类型内置字段`struct {}` 作为 receiver配合使用姿势`map` & `struct{}``chan` & `struct{}``slice` & `struct{}`总结背景golang 正常的 struct 就是普通的一个内存块,必定是占用一小块内存的,并且结构体的大小是要经过边界,长度的对齐的,但是“空结构体”是不占内存的,size .
2020-12-21 23:47:56
1021
原创 golang channel 最详细的源码剖析
大纲文章目录channel 是什么?channel 使用姿势chan 创建chan 入队chan 出队结合 select 语句结合 for-range 语句源码解析`makechan`hchan 结构chansendchanrecvselectnbsendselectnbrecvselectnbrecv2chanrecv2总结chan 是 golang 的最重要的一个结构,是区别于其他高级语言的最重要的特色之一,也是 goroutine 通信必须要的要素之一。很多人用它,但是很少人彻底理解过它,甚至 c
2020-11-09 23:32:44
931
原创 对象存储 ListObject 有啥值得思考的?
文章目录如何列举桶中对象怎么列举对象?请求参数响应格式“列举对象”是否真的很简单?ListObject 的思考总结如何列举桶中对象云存储服务对业务提供基础的数据上传、下载能力,以简单易用作为重点,但有些时候,我们有列举需求。列举是什么意思?比如我们往一个 bucket 里面上传了一些对象,但是我们不知道名字,那么只能让存储系统来告诉你,这个 bucket 里对象的列表。“列举”这是一个简单的需求,但是也有隐形的约束或者前提需要明确。对象存储一把应对的场景是海量对象(上亿级甚至更多),这种前提下,提供的列
2020-11-09 23:30:23
1610
原创 Golang 最细节篇之 — Reader 和 ReaderAt 的区别
大纲文章目录Golang 关于 Read 的两个接口定义C 语言 libc 库关于 read 的接口Golang 里 Read 和 ReadAt 的区别那么,会出什么样的坑呢?总结分享一个细节语义问题引发的思考。关于 Golang Read,ReadAt 这两个接口,不知道大家有没有仔细品过这两个接口的区别。golang 里面有两个关于 Read 的 interface ,就是 Reader 和 ReaderAt ,这两个接口的定义在标准库 io 的 io.go 文件中,如下:Golang 关于 Re
2020-11-09 23:26:33
3907
原创 Minio 为什么没有 POST 接口?
文章目录Minio 为什么没有 POST 上传接口?S3 上传协议为什么需要 Content-length ?没有 size ,怎么存储数据?公有云关于这里的隐藏知识点总结Minio 为什么没有 POST 上传接口?Minio 是著名的开源的 S3 存储项目,实现了完整的 S3 协议。仔细看了下实现,会发现 Minio 没有实现 PostObject 的接口?为什么?Minio 实现的完整对象 S3 接口如下:// Object operations// HeadObjectbucket.Met
2020-11-09 23:23:01
1978
原创 python 单元还可以更简单,最佳实践分享
文章目录更好的单测姿势安装编写单测执行单测代码覆盖率更好的单测姿势对于一个正式的项目来讲,单元测试非常重要,python 的单元测试也很简单,标准库提供了 unittest ,并且这个库非常强大,也非常重,面向对象的编程范式。一般使用如下:import unittest# 定义单元测试类,需要继承 unittest.TestCase 类;class TestStringMethods(unittest.TestCase): def test_upper(self): #
2020-11-09 23:17:49
489
原创 缓存击穿导致 golang 组件死锁的问题分享
文章目录思路排查Dump 堆栈很重要关键思路终于找到你思路整理发现蛛丝马迹完整的推理流程思考总结分享一个线上遇到的死锁问题,什么, golang 也会有死锁?思路排查Dump 堆栈很重要线上某个环境发现 S3 上传请求卡住,请求不返回,卡了30分钟,长时间没有发现有效日志。一般来讲,死锁问题还是好排查的,因为现场一般都在。类似于 c 程序,遇到死锁问题都会用 pstack 看一把。golang 死锁排查思路也类似(golang 不适合使用 pstack,因为 golang 调度的是协程,pstack
2020-11-09 23:14:30
498
原创 对象存储和 CDN 实现分析揭秘
文章目录1、使用姿势2、cdn 回源使用方案2.1、presign2.2、授权方案2.3、公共读方案3、方案对比分享对象存储和 CDN 联动的话题,一般来讲,公有云厂商提供对象存储的服务之外,还会附带一些增值服务,这些服务是适配不同的应用场景的。什么意思?对象存储本质上解决了海量存储的问题,但是数据不仅要可靠的存储,大部分情况还要处理才会有价值,所以一般公有云厂商还会有数据处理的服务,比如图像处理,类似缩略图,音视频转码,视屏截帧。其次,数据访问,也有特殊需求,比如一次上传,多次下载的场景,就配合使用 C
2020-11-09 23:10:07
921
原创 go trace 剖析 go1.14 异步抢占式调度
文章目录抢占调度go tool traceView tracegolang 抢占调度go1.13 trace 分析go1.14 trace 分析思考问题总结抢占调度go 1.14 版本带来了一个非常重要的特性:异步抢占的调度模式。之前我们通过解释一个简单的协程调度原理(),并且实现协程调度例子都提到了一个点:协程是用户态实现的自我调度单元,每个协程都是君子才能维护和谐的调度秩序,如果出现了流氓(占着 cpu 不放的协程)你是无可奈何的。go1.14 之前的版本所谓的抢占调度是怎么样的:如果 sys
2020-11-09 23:05:21
955
原创 对象存储 Bucket
layout: posttitle: “对象存储 Bucket”date: 2020-7-26 1:44:09 +0800categories: s3 对象存储 Bucket文章目录BucketBucket 是什么?Bucket 命名规范Bucket 权限类别Bucket 的创建Bucket 的删除思考问题BucketBucket 是什么?对象存储里面只有两个跟资源相关的名词:Bucket,Object。Bucket 中文直译为”桶“,Object 显而易见就是”对象“。所有 Objec.
2020-08-01 22:56:46
3547
原创 深度剖析 Golang 的 GC 扫描对象实现
layout: posttitle: “深度剖析 Golang 的 GC 扫描对象实现”date: 2020-7-31 1:44:09 +0800categories: golang GC 扫描对象文章目录扫描的目的扫描的实现编译阶段结构体对齐“长度要对齐”怎么理解?“地址要对齐”怎么理解?指针位标记运行期内存分配运行扫描阶段`scanstack`scanblockscanobject总结之前阐述了 golang 垃圾回收通过保证三色不变式来保证回收的正确性,通过写屏障来实现业务赋值器和 gc.
2020-08-01 22:55:12
551
1
原创 最高效的2FA 工具 Authy
layout: posttitle: “最高效的2FA 工具 Authy”date: 2020-7-21 1:44:09 +0800categories: 2FA 效率工具 有趣的工具文章目录Google AuthenticatorAuthy云端备份无缝切换设备多终端设备支持加密访问,加密存储全平台支持智能 Watch 解决方案怎么使用?安装使用登录注册动态验证码添加账户备份加密总结之前一片介绍密码管理器工具 1Password 的时候有提到 2FA 工具。1Password 支持 2FA ,.
2020-07-27 22:05:49
3660
原创 golang 垃圾回收(五)深入剖析混合写屏障
layout: posttitle: “golang 垃圾回收(五)混合写屏障”date: 2020-7-25 1:44:09 +0800categories: golang GC 垃圾回收 写屏障文章目录golang 混合写屏障插入写屏障删除写屏障混合写屏障golang 混合写屏障实现源码文件写屏障代码触发点`runtime·gcWriteBarrier``wbBufFlush`置灰暂停 goroutine,栈扫描`scanstack`抢占调度`newstack`总结golang 混合写屏障.
2020-07-27 22:04:53
2432
10
原创 golang 分析调试高阶技巧
layout: posttitle: “golang 调试高阶技巧”date: 2020-6-03 1:44:09 +0800categories: golang GC 垃圾回收golang 高阶调试Golang toolsnmcompileobjdumppproftrace单元测试执行单元测试go test 运行编译,运行统计代码覆盖率程序 Debugdlv 调试用法调试二进制调试进程调试 core 文件调试常用语法系统整理应用.
2020-07-16 22:40:48
3128
原创 golang 垃圾回收(四)删除写屏障 2020/5/27 13:00
接上一篇 golang 垃圾回收的梳理,这篇讲删除写屏障,golang 的内存写屏障是由插入写屏障到混合写屏障过渡的。虽然 golang 从来没有直接使用删除写屏障,但是混合写屏障却用到了删除写屏障的思路。删除写屏障:也叫做基于其实快照的解决方案(snapshot-at-the-begining)。故名思义,就是在开始 gc 之前,必须 STW ,对整个根做一次起始快照。当赋值器(业务线程)从灰色或者白色对象中删除白色脂针时候,写屏障会捕捉这一行为,将这一行为通知给回收器。这样,基于起始快照的解决方..
2020-07-11 21:52:58
1609
原创 golang 垃圾回收(三)插入写屏障 2020年6月14日
并发的垃圾回收STW 安全的回收并发的垃圾回收插入写屏障伪代码对象丢失的必要条件写屏障是怎么解决问题?并发的垃圾回收golang 语言设计的根本性追求就是高并发,低延迟,所以golang 的垃圾回收也是持续在优化。golang 的垃圾回收是并发垃圾回收设计,业务运行和回收器运行并发,这种设计的初衷是降低垃圾回收停顿时间。之前提过一个例子,如果你要安全的实现回收垃圾,那么简单的就是回收垃圾的时候,把所有的业务操作都停止,这个术语是STW(stop the world)。下面用一些术.
2020-07-11 21:52:22
1107
2
原创 golang 垃圾回收(二)屏障技术 2020/6/3 10:44
什么是屏障?golang 涉及到的三个写屏障原理分析示例分析代码先看逃逸分析写屏障真实的样子什么是屏障?承接上篇概述,下面讨论什么是写屏障?先说结论:内存屏障只是对应一段特殊的代码内存屏障这段代码在编译期间生成内存屏障本质上在运行期间拦截内存写操作,相当于一个 hook 调用golang 涉及到的三个写屏障插入写屏障删除写屏障混合写屏障(旁白:其实本质上是两个,混合写屏障就是插入写屏障和删除写屏障的混合)这三个名词什么意思?区别在哪里?最本质的区别就是:我们.
2020-07-11 21:51:23
1129
原创 golang 垃圾回收(一)概述 2020年6月3日
概述GC & RC垃圾回收的由来逃逸分析的由来垃圾回收,怎么实现?什么样的是垃圾?怎么把垃圾找出来?内存屏障概述现代编程语言一般都有垃圾回收功能。这个能极大的减轻程序员的负担,并且减少大部分场景的问题。要知道,c 语言里面最常见的就是踩内存,内存泄漏,野指针等问题。golang 作为一个新新语言,自然垃圾回收功能少不了的。当前 golang 的垃圾回收基于的理论是三色标记法,并且通过合理的使用内存屏障技术,把垃圾回收的 stw 几乎消灭(旁白:这个正确的理解,并不是.
2020-07-11 21:50:41
488
原创 groupcache 2020/5/11 17:59
groupcachegroupcache 架构设计API 接口特点client & server缓存一致性防击穿group 的机制协商填充预热机制热点数据多节点备份使用例子分布式系统中,各种场景都有缓存组件的应用身影。redis memcached 等作为内存缓存,可以缓存各种适合放到内存的元数据;cdn 也是一种缓存代理实现的产品形态(比如可以使用 nginx 来实现);项目中,我们也经常实现自己的缓存,比如用 SSD 作为更好的磁盘介质来缓存 SATA 盘的数据。.
2020-07-11 21:49:53
615
1
原创 Lease 在分布式系统的应用 2020/5/4 21:11
Lease 机制无 Lease 的数据缓存带 Lease 的缓存系统Lease 设置时间长短的讲究基于 Lease 机制确定节点状态Lease 的有效期时间选择Lease 机制Lease 中文名称叫做租约,Lease 机制式分布式系统中非常非常重要的机制,通常最重要的应用:判定节点的状态。Lease 的关键在于:一个给定的时间内,对一个承诺的坚守。Lease 过期之前,一定要坚守你的承诺。这个承诺的内容可以宽泛,可以是数据的正确性,也可以是某种授权。以一个数据缓存例子,我们用 Leas.
2020-07-11 21:49:20
218
原创 python Sphinx 生成简洁大方的文档 2020/6/6 13:28
文章目录Sphinx 简介Sphinx 怎么用?安装 sphinx 库简单示例( Spninx 使用 )步骤一:Sphinx 创建出基础配置执行 `sphinx-quickstart`配置 conf.py 文件步骤二:配置项目入口 index.rst步骤三:生成项目文档步骤四:展示出来小小总结Sphinx 简介Sphinx 是一种工具,是一个有趣 python 的第三方库,它允许程序员以纯文本格式编写文档,Spninx 可以轻松生成各种格式的输出,比如 html,pfd,等等。纯文本的文档方便使用版本管
2020-07-11 21:48:22
2762
原创 分布式系统中的 quorum 机制 2020/5/13 17:00
文章目录Write-all-read-oneQuorumQuorum 定义如何确定最新递交的值?Quorum 结合其他技术在分布式系统中,我们通常增加数据的冗余来达到较高的数据可靠性,多副本和纠删码是最常用的两种数据冗余技术。Quorum 机制则是经常配合冗余副本管理的一种机制。我们先考虑一个简单的场景,你的系统是 3 副本设计,怎么读写流程比较好?直观来讲,写的时候 3 副本都写成功才报告成功,那么读的时候随便读哪个副本都是可以的。这个是最简单的副本策略:write-all-read-one,简称 W
2020-07-11 21:46:47
653
1
原创 聊聊消息队列 2020/4/17 9:58
文章目录消息队列引入原因消息定义消息状态成功失败超时投递语义最少一次最多一次正好一次?消息协议AMQP 协议MQTT 协议常见组件ActiveMQRabbitMQRocketMQkafka消息队列简单聊聊消息队列,后续可出文章具体实例剖析,本文概览闲聊。引入原因解耦:现代分布式系统模块众多,之间存在通信和协同的需求,使用消息队列传递的方式有效解耦;异步:有的任务是同步在用户路径上,有的任务是异步,这种一般处理比较耗时,且不需要即时结果的操作,需要可靠的消息队列传递消息,推进流程;广播:同一条消
2020-07-11 21:45:54
232
原创 效率工具篇 — fiddler 2020/5/27 21:12
文章目录http 代理工具fiddler啥都不要做,先跑起来代理端口在哪里配置?对象存储协议怎么研究?怎么抓对应 host 的包?Filters 设置Inspectors 页面断点交互bpu 设置断点篡改签名头部数据http 代理工具通常来说,代理的作用常常有以下几种原因:解决网络问题:比如不同机房网络跨公网或者跨网络通信,需要走代理来解决通信问题统一鉴权:比如内部组件不能直接暴露给外部,需要走鉴权,但是我们通常不会给每一个组件都搞一套鉴权,这种情况可以只暴露一个代理组件,由这个组件解决鉴权问题,
2020-07-11 21:45:09
576
原创 效率工具篇 — 密码管理器 1Password 2020/5/27 21:09
文章目录密码管理器主流产品对比1password下载同步密码管理二次验证(动态口令)什么是 2FA?2FA 的实现形式有很多种?1Password 怎么使用的?Github 开启二次验证登录演示智能终端(Watch)配合使用总结密码管理器什么是密码管理器?顾名思义,就是管理你密码的工具。那么为什么会有这个密码管理器的需求?主要有这么几个需求:密码越来越多:当前所有的互联网软件产品,或者硬件设备,都是“账号-支付”体系,一个账号都会对应一个密码,密码非常多。比如美团一个,饿了么一个,百度一个,等
2020-07-11 21:44:11
1150
原创 一致性 hash 算法 — CARP 2020/5/11 19:38
layout: posttitle: “一致性 hash 算法 — CARP”date: 2020-05-11 3:44:09 +0800categories: hash 一致性哈希 CARP 算法 分布式哈希算法的应用DHT一致性 hashCARP应用哈希算法的应用在分布式系统中,数据的分布,或者请求的路由是一个核心的问题,实现数据的分布我们经常使用到 hash 算法。这个非常容易理解,根据一个 key 计算一个 hash ,然后根据这个 hash 值得出你的索引。.
2020-07-11 21:41:44
362
原创 一致性 hash 算法 - 虚拟节点 2020/5/12 14:06
layout: posttitle: “一致性 hash 算法 - 虚拟节点”date: 2020-05-12 3:44:09 +0800categories: hash 一致性哈希 算法 分布式文章目录一致性哈希一致性 hash —— 基础类型一致性 hash —— 虚拟节点Golang 实现结构定义hash 环的初始化hash 环添加节点一致性 hash 请求一致性哈希简单哈希 hash(object)%N 是最常用的算法,这种均衡性可能还行,但是稳定性比较差,不适用于分布式系统,.
2020-07-11 21:39:36
959
原创 python 怎么走 socks5 代理?
layout: posttitle: “python 怎么走 socks5 代理?”date: 2020-4-12 2:44:09 +0800categories: python socks5 代理 透明文章目录Python 怎么使用 Socks5 协议?Pip 安装使用场景官方例子更通用的场景PySocks 库原理设置 Proxysocksocket 类什么是 Socks5 协议?Socks5 协议鉴权查询鉴权响应代理信息代理建立响应分布式系统里要用 Socks 协议?Python 怎.
2020-07-11 21:35:30
8260
原创 http 请求怎么确定边界?
文章目录S3 上传有两种 method 方式HTTP 数据怎么确定边界?分四种情况讨论截图示例Chunked的包Content-Length的包S3 上传有两种 method 方式PUT 请求:这个上传请求上传对象协议明确携带 Content-length 的;POST 请求:这个不要求知名 Content-length,而是通过一种流式的数据传输,但是总归还是要知道边界在哪里?有以下几种...
2020-04-21 23:48:09
1355
原创 聊聊程序常用调试有哪些?
文章目录加日志加断言调试core文件代码调试golang 调试gdbdlvpython 调试程序开发,很大一部分的时间是用于调试,调试也是一门值得了解的学科,我这总结一般调试手段:加日志加断言代码调试调试core文件加日志这个就无需赘言了,你怀疑哪个地方,或者在出现问题的时候,需要知道哪个地方有问题,那么日志肯定是少不了的,而且这个也是最基本的,适用于所有语言。但是经验来看,加...
2020-04-21 23:44:46
831
multisim.11注册机
2012-10-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人