go build -gcflags '-m -l' main.go

通过编译参数可获知变量逃逸信息

func hello(x []byte) int {
    return len(x)
}

func main() {
    b := make([]byte, 10)
    b[3] = 'd'
    fmt.Println(hello(b))
}

# command-line-arguments
./main.go:5:12: x does not escape
./main.go:10:11: make([]byte, 10) does not escape
./main.go:12:13: ... argument does not escape
./main.go:12:19: hello(b) escapes to heap

项目中的id算法换成了 snowflake ,于是在 js 中就不能直接使用 Number 类型来存放id了。好奇 js 的 Number 类型最大整数范围是什么,它本身是个64位的浮点数,整数范围肯定是小于64位的,查了下貌似有两个常量可知 Number.MIN_SAFE_INTEGER ~ Number.MAX_SAFE_INTEGER,在这范围内的整数应该是安全的吧。

Number.MAX_SAFE_INTEGER = 9007199254740991
Number.MIN_SAFE_INTEGER = -9007199254740991

偶然发现我的世界居然还有声音,听着感觉还蛮不错的,就想着写个程序提取出来吧。

我的世界资源目录:
%AppData%.minecraft\
~/Library/Application Support/minecraft/
~/.minecraft/

索引文件目录:
assets/indexes/

资源内容目录:
assets/objects/

package main

import (
    "encoding/json"
    "fmt"
    "io/fs"
    "log"
    "os"
    "path/filepath"
    "strings"
)

type AssetInfo struct {
    Hash string `json:"hash"`
    Size int    `json:"size"`
}

type Assets struct {
    Objects map[string]AssetInfo `json:"objects"`
}

func main() {
    var as Assets

    // 加载文件列表
    data, err := os.ReadFile("1.16.json")
    if err != nil {
        log.Fatal(err)
    }
    if err := json.Unmarshal(data, &as); err != nil {
        log.Fatal(err)
    }

    for k, v := range as.Objects {
        if !strings.HasSuffix(k, ".ogg") {
            continue
        }

        log.Println(k)

        // 创建文件夹
        dirpath, _ := filepath.Split(k)
        if err := os.MkdirAll(dirpath, os.ModePerm); err != nil {
            continue
        }

        // 复制文件
        data, err := os.ReadFile(fmt.Sprintf("../objects/%s/%s", v.Hash[:2], v.Hash))
        if err != nil {
            continue
        }
        if err := os.WriteFile(k, data, fs.ModePerm); err != nil {
            log.Println(err)
        }
    }
}

package main

/*
#cgo LDFLAGS: -framework CoreServices
#include <stdio.h>
#include <CoreServices/CoreServices.h>

void alert() {
    CFOptionFlags responseFlags = 0;
    CFUserNotificationDisplayAlert(20.0, 3, NULL, NULL, NULL, CFSTR("提示"), CFSTR("你有一只小毛驴,从来也不骑~~~"), CFSTR("确定"), NULL, NULL, &responseFlags);
}
*/
import "C"

func main() {
    C.alert()
}

某些平台需要 cgo支持,需要注意!!!
基本代码如下:
package main

import (
    "fmt"
    "log"

    serial "github.com/tarm/goserial"
)

func main() {
    cfg := &serial.Config{
        Name: "/dev/cu.usbserial-0001",
        Baud: 115200,
    }
    ser, err := serial.OpenPort(cfg)
    if err != nil {
        log.Fatalln(err)
    }
    defer ser.Close()

    buf := make([]byte, 1024)

    for {
        n, err := ser.Read(buf)
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println(string(buf[:n]))
        ser.Write([]byte("hello world"))
    }
}