Go源码阅读2-bufio

§ 0x01 学习语言的方法

不知道某个细节该怎么写时:

  1. 自己想,去推测。
  2. 带着问题,去看源码。
  3. 带着问题,去请教有经验的人。 导师或者周围的人。

学习的点:

  1. 代码布局;
  2. 函数实现与抽象;
  3. 通过的编程范式如何使用;
  4. 其他意外的收获。

§ 0x02 bufio

上一篇为介绍看archive的总结:https://my.oschina.net/linhaha/blog/5120097

Q1: 常量定义放在头部还是靠近使用的位置?
A1:靠近使用的位置。可以看bufio.go。

const minReadBufferSize = 16
const maxConsecutiveEmptyReads = 100

// NewReaderSize returns a new Reader whose buffer has at least the specified
// size. If the argument io.Reader is already a Reader with large enough
// size, it returns the underlying Reader.
func NewReaderSize(rd io.Reader, size int) *Reader {
	// Is it already a Reader?
	b, ok := rd.(*Reader)
	if ok && len(b.buf) >= size {
		return b
	}
	if size < minReadBufferSize {
		size = minReadBufferSize
	}
	r := new(Reader)
	r.reset(make([]byte, size), rd)
	return r
}

Q2: 注释写不写?
A2:见名知义则不写,必要不能通过代码表达的要写。不一定是变量,也可能是逻辑。如Q1中的类型转换的注释。如Reset函数,包含的范围可能很大,可以在注释中说明下,具体做了什么,这是调用者关心的。

Q3: 指针调用过程中能否改变指针的指向?
A3:可以,见reset函数,通过创建新的对象实现reset。大家可以思考下,比逐个去reset各个成员的好处。

func (b *Reader) reset(buf []byte, r io.Reader) {
	*b = Reader{
		buf:          buf,
		rd:           r,
		lastByte:     -1,
		lastRuneSize: -1,
	}
}

Q4:循环里return,合理吗?
A4:合理,见fill函数。

Q5:readErr执行后,将err重置为nil了,是否合理?
A5:看情况。Unix的read调用也是会修改文件描述符的当前偏移量的。所以这里在一个读操作过程中,修改了状态看起来了合理。但可能不太符合常规,所以最好是有注释说明,源码里却没有。

Q6:任何场景下,都要考虑并发安全吗?
A6:不是。bufio这种接口,一般是不会共享给多个协程,同样的操作系统的read调用也不保证是并发安全,所以不用加锁。

Q7:如何优雅处理err?避免到处return err。
A7:通过将err定义为struct实例的成员,提供接口统一获取err。这也是coolshell上推荐的。见 https://coolshell.cn/articles/21140.html

type Writer struct {
	err error
	buf []byte
	n   int
	wr  io.Writer
}

§ 0x03 小结

通过学习标准库的源码,可以打破现有对Go的认识,可最快速度提升Go水平。

到了这个年纪,阅读Spring源码确实是一项很有价值的学习和成长任务。Spring作为一个非常知名且广泛使用的开源框架,具有非常丰富的功能和复杂的设计。通过阅读Spring源码,我们可以深入理解Spring的核心原理和设计思想,提升自己的编码能力和问题解决能力。 下面是源码阅读的一般指南: 1. 编译源码:为了阅读Spring源码,首先需要将源码下载到本地,并进行编译。Spring的源码使用Maven进行构建,所以确保你的电脑安装了Maven,并在命令行工具中使用Maven命令进行编译。 2. 理解目录结构:Spring的源码包含多个模块,每个模块负责不同的功能。在阅读之前,需要对源码的目录结构有一个基本的了解,了解每个模块的作用和关系。 3. 确定阅读顺序:Spring的源码非常庞大,单纯从头到尾逐行阅读是非常耗时和无效的。建议先从Spring的核心模块开始阅读,如Spring Core和Spring Beans。这些模块包含了Spring的基础功能和核心设计思想。当你对核心模块有了一定的了解后,再逐渐深入其他模块。 4. 重点关注关键类和方法:在阅读源码时,不需要详细理解每一行代码的细节。可以先关注一些关键的类和方法,了解它们的作用和核心逻辑。通过阅读注释和使用IDE的跳转功能,可以更加快速地定位到关键代码。 5. 结合实践运行调试:阅读源码最好的方式是结合实践进行运行和调试。可以通过使用Spring框架进行开发,将源码与实际应用场景相结合,更好地理解代码的运行过程和功能实现。 6. 查阅文档和学习资源:除了阅读源码,还可以查阅Spring的官方文档和相关学习资源,如官方文档、源码注释、博客、视频教程等,以更好地理解Spring的设计和实现原理。 通过阅读Spring源码,我们可以更深入地了解Spring框架背后的设计思想和原理,提升自己的编码水平和架构设计能力。尽管阅读源码可能会比较耗时和困难,但是对于一个专业的开发人员来说,这是一项非常有价值和必要的成长任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值