当前位置: 首页 > 科技观察

一步步攻克围棋

时间:2023-03-17 17:30:49 科技观察

学围棋的基础已经有一段时间了,那接下来应该学什么呢?有几个方向可以考虑,比如Web开发,网络编程等。在写项目的过程中,我发现了一个问题。功能实现没问题,但不知道自己写的代码是否符合Go风格,是否足够优雅。所以我觉得与其继续学习应用开发,还不如深入到底,打好基础,为写Go代码打好基础。于是,我决定开始阅读Go标准库的源代码。Go共有150多个标准库。全部看完也不是不行,但绝对是个大工程。我希望我能坚持下去。为什么要从Go标准库的源码开始阅读呢?因为最近看了一些Go底层原理的书。说实话,goroutine调度,gc垃圾回收之类的东西我是不懂的。如果一上来就看这部分代码,怕是直接放弃Go语言的学习了。标准库是不同的。有些代码根本不涉及底层原理,实现起来也比较简单。同时可以加深对围棋概念的理解。作为介绍很好。然后由浅入深,一步一个脚印,就像打怪升级一样,一步步征服围棋。说了这么多,应该怎么读呢?我想到了一些方法:看官方的标准库文档。在网上看别人的技术文章。写一些例子来练习如何使用它。如果可以,请自己实现标准库功能。总结输出自己的阅读心得。你可以结合以上的一种或几种方法,然后不断的阅读和总结,最终找到一个完全适合你的方法。下面是我总结的一些标准库和函数介绍:archive/tar和/zip-compress:压缩(解压)文件函数。fmt-io-bufio-path/filepath-flag:fmt:提供格式化输入输出功能。io:提供基本的输入输出功能,大部分是围绕系统功能的封装。bufio:缓冲输入输出函数的封装。path/filepath:用于操作当前系统中的目标文件名路径。flag:提供对命令行参数的操作。strings-strconv-unicode-regexp-bytes:strings:提供对字符串的操作。strconv:提供将字符串转换为底层类型的函数。unicode:为unicode类型的字符串提供特殊功能。regexp:正则表达式函数。bytes:提供对字符切片的操作。索引/后缀数组:快速查找子串。math-math/cmath-math/big-math/rand-sort:数学:基本数学函数。math/cmath:复数运算。math/rand:伪随机数生成。排序:对数组和自定义集合进行排序。math/big:大数的实现和计算。container-/list-/ring-/heap:list:双链表。ring:循环链表。堆:堆。compress/bzip2-/flate-/gzip-/lzw-zlib:compress/bzip2:实现bzip2解压缩。flate:一种数据压缩格式,实现了deflate,如RFC1951中所述。gzip:读写gzip压缩文件。lzw:LempelZivWelch压缩数据格式实现。zlib:实现zlib数据压缩格式的读写。context:用于简化处理单个请求的多个goroutine之间的数据、取消信号、截止时间等相关操作和请求域。crypto-crypto/md5-crypto/sha1:crypto:常用密码常量的集合。crypto/md5:MD5加密。crypto/sha1:SHA1加密。errors:实现操作错误的方法。expvar:为公共变量提供标准化的接口。hash:所有哈希函数实现的通用接口。html:HTML文本转码转义函数。sort:提供用于对切片和用户定义的集合进行排序的原始函数。unsafe:包含一些破坏Go语言“类型安全”的命令,一般程序不使用,可用于C/C++程序的调用。syscall-os-os/exec:syscall:提供调用底层操作系统的基本接口。os:为我们提供了平台无关的操作系统功能接口,采用了类Unix的设计,隐藏了不同操作系统之间的差异,使得不同的文件系统和操作系统对象表现一致。os/exec:提供运行外部操作系统命令和程序的方式。time-log:time:日期和时间的基本操作。log:记录程序运行时产生的日志。encoding/json-encoding/xml-text/template:encoding/json:读取和解码以及写入和编码JSON数据。encoding/xml:简单的XML1.0解析器。文本/模板:生成与文本混合的类似HTML的数据驱动模板。net-net/http:net:对网络数据的基本操作。http:提供可扩展的HTTP服务器和解析HTTP请求和回复的基本客户端。runtime:Go程序运行时交互,比如垃圾收集和协程创建。reflect:通过程序运行时实现反射,让程序可以操作任意类型的变量。这里只是标准库的一部分,更全面的标准库列表可以直接看官网。那么问题来了,那么多库从何下手呢?我在这里做一个简单的分类。由于水平有限,我只能做一些简单的整理,大家可以根据自己的实际情况进行选择。有些图书馆涉及到非常专业的知识,投入产出比可能比较低。比如archive、compress、crypto,涉及到压缩算法和加密算法的知识。有些库是工具,比如bufio、bytes、strings、path、strconv等,这些库不涉及领域知识,更容易阅读。有些库是跟操作系统打交道的,比如os、net、sync等,学习这些库需要对操作系统有清晰的认识。net下的很多子包都是和网络协议相关的,比如net/http,里面涉及到http报文的解析,需要对网络协议有一定的了解。如果你想了解语言的底层原理,你需要阅读运行时库。如果想快速上手,了解语言的设计理念,推荐阅读io和fmt库。看完之后,你会对界面设计有更深的理解。我查看了一些源代码,虽然这很麻烦,但它确实很有用。前期可能会比较难理解,时间会长一些,但是形成固定的套路之后,就会越来越熟悉,花的时间越来越少,理解越来越深刻。