Golang 1.18 语言规范改动
泛型详见:Golang 泛型初级教程和 Golang 泛型中级教程。匿名函数内的未使用变量在 Go 1.18 之前的版本,以下在匿名函数内的未使用变量 p 不会返回错误:1 2 3 4 5 6 7 8 package main func main() { p := true func() { p = true }() } 在升级到 Go 1.18 后,会正常返回未使用错误:1 2 # command-line-arguments ./main.go:4:2: p declared and not used rune 类型的溢出在 Go 1.18 之前的版本,以下 rune 类型的溢出不会返回错误:1 2 3 4 5 package main func main() { print('1' ..
更多MySQL 的最左匹配原则
依旧是面试查漏补缺。这次是 MySQL 的最左匹配原则。 废话不多说,直接看 MySQL 官方文档给出的例子。 有这么一个表: 1234567CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name, first_name)); 可以看出,表里面有一个联合索引 (last_name, first_name)。那么,查询的时候,这些语句就可以成功走索引: 1234SELECT * FROM test WHERE last_name = 'Doe';..
更多群晖NAS ESTAT扩容
Foreword 老群晖D918+只有4盘位,已经升级了一次,4张8T依然不够用,新搭的服务器的硬盘竟然是2.5的,还只能上固态,上普通硬盘没啥性价比。 无意间发现群晖竟然还能扩容 ESTAT 群晖ESATA是群晖网络存储设备中的一种接口,它是一种高速的数据传输接口,可以提供比USB和Firewire更快的传输速度。群晖ESATA接口可以通过连接ESATA设备来扩展存储容量,如硬盘、光驱等 DX517 群晖官方的ESATA硬盘扩展柜,但是价格十分离谱,基本就是一个5盘位的新NAS的价格,如果这种价格我为什么不再买一个NAS呢 魅视 M517 只有DX517一半不到的价格,但是同样扩展5盘位,性价比拉满 优越者 5盘位RAID USB3.0 ESATA接口 更便宜一些,可惜支..
更多使用USB接口连接STM32F103C并控制舵机
起因 前段时间把我的小主机连带路由器硬盘等设备带回了老家,老家也有ipv6,所以无缝衔接,随后安心出去游玩。某天我一如既往地打开nextcloud准备上传图片,发现服务挂了,然后发现是家里停过几小时的电。虽然路由器和小主机都有来电自启,但硬盘盒通电后需要手动按一下开关才能启动,我人不在家,所以这段时间和NAS相关的服务全都无法启动。 遂琢磨着弄个东西远程启动硬盘盒。 调研这个功能如果用树莓派做应该很简单,但我没有带回来,而且用树莓派专门操作一个舵机也太杀鸡用牛刀了。第一个想到的当然是单片机,一顿搜索,目标定位到了ESP32和STM32,都是非常便宜的单片机,两者的资料也都非常多。 但,不..
更多Golang 泛型中级教程
使用类型约束首先,来看一个函数,它的功能是返回两个参数中数值较小的参数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func Min(x, y int) int { if x < y { return x } return y } func TestMin(t *testing.T) { var inputIntX int = 1 var inputIntY int = 2 var wantInt int = 1 gotInt := Min(inputIntX, inputIntY) if gotInt != wantInt { t.Errorf("gotInt %v, wantInt %v", gotInt, wantI..
更多Golang 泛型入门教程
泛型的优势泛型编程(Generic Programming)是现代编程语言中的一项强大功能,它允许程序员编写出一种通用的形式来表示函数或数据结构,从而抽象出数据类型。泛型的使用可以极大地减少代码重复,增加程序的灵活性与可维护性。对于库的开发者来说,泛型的确引入了额外的复杂性;但对库的使用者而言,泛型提供了简洁和强大的工具,极少地增加了复杂性。入门教程首先,来看两个函数,它们的功能都是计算一个切片中所有元素的总和: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func SumInts(s []int) int { var r int for _, v := range s { r += v } return r } func SumFloats(s ..
更多Golang 泛型初级教程
泛型的优势泛型编程(Generic Programming)是现代编程语言中的一项强大功能,它允许程序员编写出一种通用的形式来表示函数或数据结构,从而抽象出数据类型。泛型的使用可以极大地减少代码重复,增加程序的灵活性与可维护性。对于库的开发者来说,泛型的确引入了额外的复杂性;但对库的使用者而言,泛型提供了简洁和强大的工具,极少地增加了复杂性。初级教程首先,来看两个函数,它们的功能都是计算一个切片中所有元素的总和: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func SumInts(s []int) int { var r int for _, v := range s { r += v } return r } func SumFloats(s ..
更多监听 Tomcat 的启动、停止事件
当 Servlet 容器启动或终止 Web 应用时,会触发 ServletContextEvent 事件,该事件由 ServletContextListener 来处理。在 Servlet API 中有一个 ServletContextListener 接口,接口中定义了处理 ServletContextEvent 事件的两个方法,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。我们可以通过实现这两个方法,来实现在 Tomcat 启动和停止时执行一定的操作。 监听器类编写新建一个监听器类 TomcatListener 并实现 ServletContextListener 接口 1234567891011public class DemoListener..
更多SwiftUI 学习记录 - 切换 TabView 的 tab 时触发震动反馈
最近在折腾 iOS 开发的时候,想实现在切换 TabView 的 tab 时触发震动反馈,因为一边写一边学嘛,基础不牢,只能在网上瞎搜,试了各种方法都不奏效。直到前两天看到 Ice Cubes: for Mastodon 的这段代码,豁然开朗。 之前写的时候,只知道给 selection 传一个绑定的对象,但是看完 IceCubes 的代码,再一看 selection 参数的文档,恍然大悟,这个参数要的其实是一个 SelectionValue 的绑定对象,所以我其实可以在这个对象的 set 方法上面做文章。 12345678910111213141516171819202122struct ContentView: View { @State private var selectedTab..
更多SwiftUI 学习记录 - 使用 Alamofire 加载 JSON 并初始化列表
这两天又捡起来了之前开的一个老坑,继续完成 X 岛揭示板的 iOS 客户端,而且刚刚完成了从 JSON 初始化版面列表的功能。这部分感觉最难的还是上手 Alamofire,因为它返回结果不像我平时做 Web 开发那样通过方法返回(也有可能是我没学到位),而是要把反序列化得到的对象传给一个回调方法。而这个思路的差异也导致我刚开始学的时候非常的痛苦,因为怎么也找不到我想要的那种返回方式。我相信应该不止我一个人会遇到这种情况,所以打算在这里把完整的实现过程记录在这里,并希望后面有类似情况的同志能因为这篇文章而少掉几根头发。 定义 JSON 对应的结构体X 岛揭示板的版面列表 API 会返回一个类似这样的 JSON: 1234567891011121314151617181920212223242526272..
更多