在 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 逃逸吗?

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

阅读剩余部分

这个月写的代码比较多了,主要在做重构

重构

这个月将以前一个烂尾的项目拿出来彻底重构了,后端由 PHP 换成了 Go,前端(之前没有,纯 iOS 捷径交互)用了 React.js。

抽空看了下开源项目 Answer 的编码风格,Answer 用的 wire 做依赖注入,整体风格还是挺清晰易懂的(我们之前做的项目也用了 wire,但还是没用到精髓,更像是为了用而用)。

这次重构进行得比较慢,因为在学习 Answer 的编码风格,同时也在整理一套我自己的 Go HTTP API 项目的 skeleton

Cloudflare Tunnel

尝试了一下 Cloudflare Tunnel,第一件事就是把博客从腾讯云香港机房迁移回到家里的服务器(没错,你看到的这篇文章就是放在广州的一台旧笔记本上的),然后用 Cloudflare Tunnel 暴露到公网,还自带 CDN

新文章

关于时区在开发中的一些思考

过去三年我在做一个面向港澳台和日本的未上线项目,关于「时区」这个概念,在做开发的过程中会有些抽象,一直觉得对于时区的处理很混乱(不管是代码、服务器设置,还是运营需求)。

今年休假去日本玩了一趟,这是我人生中第一次离开东八区,因为只是短暂的旅途,跟国内的联系还是非常紧密的,所以切实体会到了跨时区带来的一些不同体验。

《小谢尔顿》- 时区

于是决定写下这篇关于「时区」的思考的文章,可能会对各位做开发的朋友有一点帮助 :-P

阅读剩余部分

Juniper Photon 的启发,决定从这个月开始,每月写一篇总结,主要记录分享下过去一个月(2024.10.19~11.18)的产出和思考


过去一个月算是一个比较松弛的状态,全国各地跑了好几个城市,跟几个朋友聊了下近况和准备的事情,也趁着闲暇时间梳理了下之前的一些烂尾项目,把该还的技术债还一还。

阅读剩余部分

最近在用 LemonSqueezy(lemonsqueezy.com) 做 side project 的收款服务,需要用到 webhook 来处理用户付款后的自动发货流程。

项目后端用的是 Go 语言,gin 框架,截止项目启动的时,没能在 GitHub 上找到 LemonSqueezy 的 webhook SDK,于是就徒手写了个,用了一段时间之后把代码整理了一下开源了。

因为 gin + lemon,于是就取名叫 gin and tonic 了😆

如果刚好你也在用 gin 框架,那么这个库你可以开箱即用:

Gin&Tonic

项目地址:https://github.com/YianAndCode/gintonic

最后祝大家财源滚滚,It's lemon squeezy to make money!