最新文章
    MySQL JSON 数组查询实战:JSON_CONTAINS 用法详解与 LIKE 的本质区别
    MySQL 中如何优雅地查询 JSON 数组字段(以及它和 LIKE 的区别)

    很多业务表里都会有这么一个字段:

    [{"uri":"/v1/xxx"}]
    

    它是一个 JSON 数组,数组里是对象。
    问题来了:

    如果我想查出「数组中存在 uri = '/v1/xxx'」的记录,该怎么写 SQL?

    再进一步:

    这样写和 LIKE 有什么区别?

    这篇文章把这个问题讲清楚。


    一、推荐写法:JSON_CONTAINS

    假设表结构:

    • 表名:api_table
    • 字段名:data
    • 类型:JSON(推荐)或 `V
    Golang初版Mutex
    Golang初版Mutex

    2008年,Russ Cox提交的初版Mutex的代码如下:

    // CAS操作,当时还没有抽象出atomic包
    func cas(val *int32, old, new int32) bool
    func semacquire(*int32)
    func semrelease(*int32)
    
    // 互斥锁的结构,包含两个字段
    type Mute
    
    2/1/2026golang
    opencode配置中转站的方法
    opencode配置中转站的方法
    准备
    • 环境:mac os系统(window系统,opencode配置位置稍微不一样,在c盘用户/你的用户名/.config/opencode/opencode.jsonc或者opencode.json,下面修改操作找到配置文件打开跟着编辑就行
    • 已安装opencode
    • 咸鱼或其他地方购买中转站的服务,获取中转站的域名和密钥
    配置

    进入opencode配置地址看看是否已有配置opencode.json或者opencode.jsonc

    cd ~/.config/opencode && ls -l
    

    **没有则创建,有则编辑(此处用vi

    用 1 天,彻底重启你的人生操作系统
    用 1 天,彻底重启你的人生操作系统

    大多数人不是不努力,
    而是在用错误的方式反复努力。

    真正阻碍你改变的,
    从来不是自律、执行力或方法论,
    而是你早已默认却从未审视过的——
    人生操作系统。

    如何用 1 天,重启你的人生

    很多人觉得新年计划是个笑话
    说实话,这个判断并不完全错。

    因为大多数人改变人生的方式,从一开始就走偏了。

    他们之所以制定计划,并

    普通人,如何把话说得更有智慧?
    普通人,如何把话说得更有智慧?

    我小时候,总是被那些听起来很聪明的人吸引。

    他们不一定说得很快,也不一定很幽默,但总能把复杂的问题讲得有层次、有深度。
    即使当时我并不完全听懂,只要对方表达清晰、逻辑自洽,我就会下意识地尊重他们。

    但那时候,我从没想过——
    我也可以成为这样的人。

    我一直觉得,能把复杂问题讲清楚,是一种天赋。
    而我,只是那种“在学校里成绩还不错的人”

    检查Golang程序中的数据竞争
    检查Golang程序中的数据竞争

    数据竞争是并发程序中最常见的,也是最难发现的并发问题,所幸的是,Go内置了在一定程度上可以发现竞争问题。你可以在测试数据竞争检测器(data race detector),或者运行程序时使用-race开启数据竞争检测器,或者在编译程序时开启,编译好的二进制程序在运行时也可以开启数据竞争检测:

    go test -race mypkg	// 测试mypkg包
    go run -race mysr
    
    Golang锁-Mutex的用法
    Golang锁-Mutex的用法

    因为并发编程中有竞争条件和数据竞争的问题,我们才需要将代码片段设定为临界区,通过使用Mutex等同步原语将临界区保护起来。接下来,我们来熟悉Go标准库的Mutex 的使用方法,看看它是如何保护临界区,解决竞争条件和数据竞争的问题的。

    一个并发问题

    有时候,我们很清楚地知道临界区或者共享资源,能主动地发现数据竞争问题;但是有时候,数据竞争问题却不那么容易被发现,比如下面这段代码,你认为有数据竞争

    竞争条件与数据竞争
    竞争条件与数据竞争

    竞争条件和数据竞争是两个相关的概念,它们都涉及多线程环境中的数据竞争。但是,它们也有如下一些重要的区别。

    • 竞争条件:指的是在多线程环境中,由于操作顺序的不确定性导致的程序执行结果的不确定性。例如,如果两个线程同时对同一个变量进行读/写操作,那么它们的执行顺序将会对最终的结果产生影响。这就是竞争条件。外部时序或排序的非确定性会产生竞争条件;典型的示例包括上下文切换、操作系统信号、多处理器上的内存操作和硬件中断等。竞争
    Go运行时调度器
    Go运行时调度器

    了解Go运行时对goroutine的调度,对于深入分析和理解并发程序还是很有帮助的。

    当操作系统的线程切换到另一个线程时,CPU会执行一个操作,叫作上下文切换(context switch),操作系统会在中断、系统调用时执行线程上下文切换。线程上下文切换是一种昂贵的操作,因为操作系统需要将用户态转移到内核态,保存要切换线程的执行状态,也就是将一些重要寄存器的值和进程状态保存在线程控制块数据结构中。当恢复线程的运行时,需要将这些状态加载到集群中,从内核态转移到用户态。想想就比较复杂、耗时,如果又涉及进程上下文切换,就更加耗时了。goroutine的调度是由Go运行时控制的,每个编译的Go程序都

    Go并发并不一定最快
    Go并发并不一定最快

    一般来说,正如我们平常理解的那样,将串行程序修改为并行程序之后,其性能会得到提升。但也不是绝对的,在某些情况下,串行编程性能反而更好。

    下面这个例子是快速排序的串行实现。

    // 快速排序中的分区,把a分成左右两部分,左边部分小于右边部分
    func partition(a []int, lo, hi int) int {
    	pivot := a[hi] // 将最后一个值作为分界值
    	i := l
    
    1/6/2026golang并发