分类 编码 下的文章

微信小程序的 WXML 目前(2025.07)是不支持 <svg> 标签的,所以没办法直接使用 Lucide 这一类的图标,但小程序提供了 <image> 标签,是支持 SVG 格式的,但!直接用 <image> 引入 SVG 就没办法自定义颜色了。

有解决方案吗?有的,因为 <image> 是支持 base64 格式的,那我们动态创建 SVG 图标即可。

怎么动态创建呢,把图标的 SVG 字符串中的颜色熟悉(stroke)提取出来,将整个 SVG 字符串作为图标模板,然后用字符串的 replace() 替换即可。

本文的代码是 React + Taro,其他框架的思路是一样的,只是写法略有差异。这里需要用到 js-base64 这个库,记得先 npm 安装一下。

以 Lucide 的 book 图标为例,它的 SVG 是这样的:

- 阅读剩余部分 -

在 Go 里可以通过 CGO 调用 C 函数,最简单的写法就是直接在 import "C" 前一行写 C 函数:

package main

/*
int sum(int a, int b) { return a + b; }
*/
import "C"
import "fmt"

func main() {
    fmt.Println(C.sum(C.int(1), C.int(2)))
}

但,如果是那么简单的函数,也不需要用到 CGO,直接 Go 实现就行了,真要用到 CGO 了,大概率就是你需要调用一些比较复杂的 C 代码,可以用下面两种方式实现:

- 阅读剩余部分 -

最近在给一个 HTTP 服务写 SDK,这个 HTTP 服务的响应是下面这种经典格式:

{
    "cdoe": 0,
    "msg": "ok",
    "data": {}
}

那么在 Go 里定义结构体的时候就会长这样:

type Custom struct {
    // ...
}

type SomeResponse struct {
    Code int    `json:"code"`
    Msg  string `json:"msg"`
    Data Custom `json:"data"`
}

相应的方法会长这样:

SomeService(ctx context.Context, param any) (*Custom, error)

因为 Custom 的内部可能会有很多数据,所以是以指针作为返回值的,尽量避免数据拷贝;而 Code != 0 这种情况就通过 error 返回。

内部实现大概会是这样:

func (s SDK) SomeService(ctx context.Context, param any) (*Custom, error) {
    var resp SomeResponse
    err := s.request(ctx, "/someservice", param, &resp)
    if err != nil {
        return nil, err
    }

    if resp.Code != 0 {
        return nil, fmt.Errorf("code: %d, err: %s", resp.Code, resp.Msg)
    }

    return &resp.Data, nil
}

通常我们到这一步就算是完成任务了,但是这时候我想了下:return 之后,GC 是怎么回收 resp 的呢?是会把 resp.Coderesp.Msg 的内存回收了,只让 resp.Data 逃逸吗?

这个问题不算复杂,动手做个实验就知道了。先把上面的代码简化一下:

- 阅读剩余部分 -