作者回复: 👍
作者回复: go最初有很多web框架,经过多年演进,目前gin这个web框架似乎成为了go社区的首选。
作者回复: 项目都是在mac/linux上做的。但理论上windows可以直接使用。你提到的项目放在gopath或goroot下是不必要的。支持go module模式后,如果启用了go module构建模式,放在哪个目录下都是可以的。 另外项目代码放在了github上,在文章末尾有链接。可直接clone后使用。
作者回复: 先“照猫画虎”吧。一旦涉及此类实战小项目,必然会有没有系统学习的内容。后面学习新语法时,可以回过头来复习。
作者回复: 好问题! 首先errChan并不是等shutdown之后 listenAndServe报错的。而是等运行国产中,listenandserve一旦报错,程序可以退出。 接下来,我们再说说优雅退出。按照你的描述,我翻了一下net.http的文档: “Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners, then closing all idle connections, and then waiting indefinitely for connections to return to idle and then shut down. If the provided context expires before the shutdown is complete, Shutdown returns the context's error, otherwise it returns any error returned from closing the Server's underlying Listener(s).” 我的理解是调用Shutdown后,ListenAndServe()方法的确会马上返回,不过这个无所谓了,listenandserver只是将listen端口关闭,不接受新连接了。 真正等待存量连接处理完毕的是shutdown方法,shutdown方法调用后,不是马上退出的哦。shutdown方法有一个ctx,专栏中传入了一个timeout ctx,时间为1s。即等待1s。关键就在这里。在生产环境,我们可能不能无限期等待程序退出,我们会设置一个timeout。如果shutdown在1s内完成等待,成功退出,这是最理想的。如果shutdown没有在1s内完成等待,即存量连接还没有处理完,那么按照我们的约定,我们也不能再等了。 当然这里只是demo,使用的timeout=1s。在生产中,你可以根据业务的类型以及经验值来等待。甚至可以进行无限等待,这完全取决于你的系统。
作者回复: 问题1. 你的理解没有错。 问题2. 可以不用另起,记得好像有些工具在格式化时会自动填上。 3. 定位不同,这个是入门专栏。那个进阶专栏。有很小部分有相似的地方,但讲解方式都做了调整和优化。建议学完这个专栏后,再去看看那个专栏。 4. rpc封装的很深,如果仅是使用的话,没啥东西。这个专栏更多聚焦于go语法以及尽量使用标准库的东西做一些实用程序和项目。
作者回复: 这一讲开头我就说了:“在这个小项目里,我希望你不要困在各种语法里,而是先跟着我““照猫画虎”地写一遍、跑一次,感受 Go 项目的结构,体会 Go 语言的魅力。” 😁 不用担心,往后学一学之后再来复习。
作者回复: good idea。已创建https://gitee.com/bigwhite/publication/tree/master/column/timegeek/go-first-course 供下载。
作者回复: 你说的是func (bs *BookStoreServer) ListenAndServe这个方法吧?这个函数等待1s后返回啊。但它启动的子goroutine依旧在运行的。子goroutine中bs.srv.ListenAndServe一直在工作,并提供服务。
作者回复: 原则就是如果标准库中的mux可以满足,尽量不引用第三方包。如果标准库无法满足,尽量引用规模较小的包。gin是更大的web框架。除了mux,还有很多其他功能。如果不是项目必需,使用更“专一”的包可能更好。