学到了 Go 语言本身的语法之后,开始步入 Go 的应用部分,掌握一个语言不得不接触的就是它对文件,网络的操作。
在正式进入主题之前不得不抱怨一下 Go 的官方编码规范中的代码缩进格式。曾经 Google 出的 Java 缩进规范是用两个空格(通常是用四个空格),并且是杜绝用 Tab 进行缩进的,因为 Tab 的宽度是不很确定的。
然而 Google 建议 Go 的代码格式化工具 gofmt 却反常规的强制使用 Tab 进行缩进,而且是。本人用 IntelliJ IDEA 编写 Go, 即使在 Go 的 Code Style 中把Use tab character去掉也是用 Tab 缩进,原因是在 Code Style > Go 的 Other 中有项 Run gofmt [] On code reformat, 这项也不能勾选。
不明白go fmt或gofmt为何强势而无理的用 Tab 进行缩进,看到多数地方以 8 个空格来显示一个 Tab,实在是难看,像下面这样子的 Read More
终于要开始了解 Go 的结构体和接口了。Go 的结构体只是一种纯粹的数据类型,而不像 C/C++ 的结构体里还能添加方法。Go 的 struct 更像是 Python 的 dataclass, 或 Java 的 record。Go 的结构体是值类型,通过 new 函数来创建,在 C/C++ 中,只要是 new 得到的就是指针。
结构体的字段名称也可以用_, 相当一个点位填充,字段也可以只有类型没有名称,称之为匿名字段。 Read More- Go 语方的数组声明方式别具一格,把 [] 看得太重了,看下面的各种声明方式再次强调 Go 的数组是值类型,作为函数参数传递会产生副本。避免传入数组产生副本消耗过多内存,办法是可传数组指针或用切片,切片是第一选择。
1var a = [...]int{18, 20} // 这是一个数组,如果省略 ..., 写成 []int{18, 20} 就是一个 slice 2var b = [5]string{"hello", 3: "ok"} //指定位置初始化 3var c = [...]float32{2.0, 2.3} // ... 可省略 4var d [20]int // d 的类型是 [20]int 5var e = new([20]int) // e 的类型是 *[20]int, 这是一个数组指针 6var g = [2][2][2]float64 // 多维数组 7var h = [...][5]int{{10,20}, {30,40}} // 类似其他语言一样,只有第一维才能用 [...]
数组的大小最大为 2GB,用==或!=比较两个数组时它们必须类型和长度一致。 Read More
Go 语言 2009 年面世,几个成功项目 Docker, Kubernetes, etcs, consul, flannel, 还有 Terraform。Go 编译运行快,听说学习也不难。安装好 Go 后,有两个环境变量很重要, GOPATH 是工作目录,GOROOT 是 Go 的安装目录, 如 /usr/local/go。GOPATH 允许多个目录,用 : 或 ;(Windows 下) 分隔,当 GOPATH 有多个目录,go get 命令的包放在第一个目录下。
$GOPATH 目录中约定的三个子目录- src: 存放 .go, .c, .h, .s 等源码文件,go run, go install 等命令也要在该目录下执行
- pkg: 存放编译时生成的中间文件,如 .a
- bin: 存放编译后的可执行文件
Java 一路突突突, 版本 16 在 2021-03-16 都发布了, 而我们一直碍于 Java 9 的大改还在 Java 8 上原地踏步, 以往每当有新版本 JDK 发布后都是很快就验证,立马升级。Java SE versions history) 列出了所有 Java 的历史版本的发布日期。在今天(2021-05-04) 网站 Java SE Downloads 上直接提供下载的 Java SE 版本有以下三- Java SE 16.0.1
- Java SE 11.0.11(LTS)
- Java SE 8u291
两个 LTS(长期支持) 版 8 和 11,外加一个目前最新的非 LTS 版本 16, 其他的版本都被归档到了 Java Archive. 查看一下 Java 支持的 roadmap, 几个 LTS 版本的服务支持年限版本本 发布日 原定支持至 延期支持至
注意到 Java 8 将比 Java 11 和将来的 Java 17 生命力还顽强,一下就觉得这么久坚守在 Java 8 的阵地上不应觉得有什么好害羞的。眼看着下一个 LTS 版本的 Java 17 就要在今年 9 月份发布了,Java 11 看来是要错过了,等准备好和 Java 8 告别时要直接跳到 Java 17 了。 Read More
Java 8 2014/3 2022/3 2030/12
Java 11 2018/9 2023/9 2026/9
Java 17 2021/9 2026/9 2029/9- 自去年 10 月底搬家后就基本没再写日志了,其间常登陆后台看到 WordPress 及其插件不停的有提示升级,每次都是能升就就升,至少前台的页面显示没多大问题。只有过一个小问题,左边最新评论的 Widget 显示不出东西来,把最后更新日期为 8 年前的 WP-RecentComments 插件变成了 Decent Comments 后解决。
昨天才开始琢磨着写一篇关于 Mockito Mock 静态方法的日志,才意识到一直以来不知拒绝的跟风似的升级 WordPress 主体和插件给后台带来了不得不面对的问题。
首先,传文件总是失败,在 Media 或Add Media时也无法浏览图片,翻看 Apache2 的错误日志也没找到问题。无奈,手工通过 SCP 上传吧,一登陆到服务器上却发现即使界面提示失败,但文件实际上是在已上传到了服务器上了的。先这么着吧,切换编辑器到文本模式手工写 <img> 标签来引用图片。 Read More
又一月有半未落下一个符号了,越来越喜爱用 Python 来高效的辅助日常工作了。先前在 Shell 下使用 Python 代码,因为 Vim 可以配置 Kite 进行代码的自动完成。很早就知道 Jupyter Notebook, 但觉得它还不够漂亮,又没代码提示,也就一直没理会它,后来看到 Kite 可以支持 JupyterLab, 一启动 JupyterLab 的那一瞬间,果然比 Notebook 高大上了许多。有了 Kite 加持,写代码更是顺畅的多,当然还飞不起来。Notebook 应该是一个更经典的工具,它的一系列插件还得稍稍移植到 JupyterLab 上去才能用。
本文快速体验一下 JupyterLab, 从自身到几个基本插件的安装。本人使用的操作系统是 Mac OS X, 刚开始用python -m venv jupyterlab-venv创建的虚拟环境中用pip来安装,后来发现不知何时在我的 Python 3.8 的 bin 目录中居然安装有 jupyter 和 jupyter-lab 命令,pip install jupyterlab后jupyter-lab --version和jupyter lab --version显示的是不同版本 Read More
Java 虚拟机分析工具用 JDK 自带的jconsole,jvisualvm, 和jmc(Java Mission Control) 就已经非常好了,还真极少情况下(甚至没有)非得用商业的 Profiler 工具如 YourKit Java Profiler 或 JProfiler 的情况。用于实时观察 JVM 的内存, CPU, 线程等运行状况,对比 Heap 快照,发现线程死锁的应用情景,我比较喜欢用jvisualvm(VisualVM)。
有很长一段时间,因为在家办公司,只要连接到公司的 VPN 后再执行jvisualvm来打开 VisualVM 时,会有很长的时间(可能长达 10 几分钟)卡在窗口右下角状态栏的Computing description...,要等到它消失后才能开始连接 JVM,这时候我的 Java 应用可能早就退出了。要是本地不连 VPN 的话就正常,启动 VisualVM 是正常的,但调试有些工作项目又必须连接公司的 VPN。
这种使用 VisualVM 的体验有如恶梦一般,还是有经常要用到 VisualVM 的需求,所以再也不能忍受这种无谓的等待。依然是 Google + StackOverflow 的模式,找到原来罪魁祸首是 /etc/hosts中的127.0.0.1这个条目。 Read More
使用了一段时间的 Vue.js 以后,其中有大量的 ES6 的export/import用法,如import axios from 'axios';
因为目前对 ES6 的
import Home from '../views/Home.vue';
export default {
data() { .... }export/import用法是一知半解的,所以基本上都是基于 vue-cli 创建的项目上依葫芦画瓢,更是不太理解 vue 的项目是如何由main.js->App.vue把所有的 router, views, 和 components 串联起来的。为了进一步理清 Vue.js 项目的初步运行机制,现在开始着手试图通过一个例子来尽可能多的理解 ES6 的 export/import 用法。
我不是标题党,所以不可能命名如:理解 export/import 一篇就够了,全网最全诸如此类的。且本人博客主要是记录自己学习过程的,而非为了招人眼球。所以尽力吧,在一个代码例子中尽可能多的展示 export/import 的用法,为不增加代码的复杂性,有些技巧在代码后进行解释。 Read More
本来只是为了研究一下 Flask 怎么去支持早已在 Python 的支持的 coroutine 功能,没想步子越迈越大,直顶到 aiohttp Web 服务器和 Flask 的异步实现版本 Quart。Flask 得费了好一番功夫去获得EventLoop,可知 aiohttp 和 Quart 的路由方法直接就允许async的,那个EventLoop自然就在其中。从async的路由方法出发去调用别的异步方法就是一件十分轻松的事情。
下面来稍稍体验一下用分别用 aiohttp 和 Quart 实现简单的异步服务器,我们的关注点在它的异步路由。
Read More