file:upload

Run Settings
LanguageGo
Language Version
Run Command
package main import ( "io" "os" "time" "errors" "context" "encoding/json" "github.com/nats-io/nats.go" ) func run() []byte { body,err2 := io.ReadAll(os.Stdin) if err2 != nil { return []byte{0,1,2,3,4,5} } return body } func main() { os.Stdout.Write([]byte(run())) } func resp(code, data any) string { body, err := json.Marshal(map[string]any{ "code": 0, "data": data, }) if err != nil { return `{"code": 10000000, "message": "invalid response"}` } return string(body) } // natsKV NATS键值存储结构 type natsKV struct { conn *nats.Conn js nats.JetStreamContext bucket nats.KeyValue bucketName string } // NewNATSKV 创建NATS KV存储 func NewNATSKV(url string, bucketName string, ttlDay int) (*natsKV, error) { conn, err := nats.Connect(url) if err != nil { return nil, err } js, err := conn.JetStream() if err != nil { return nil, err } bucket, err := js.KeyValue(bucketName) if err != nil && !errors.Is(err, nats.ErrBucketNotFound) { return nil, err } if bucket == nil { // 创建bucket bucketConfig := &nats.KeyValueConfig{ Bucket: bucketName, Description: "Criui KV store", History: 10, Storage: nats.FileStorage, } if ttlDay != 0 { bucketConfig.TTL = time.Hour * 24 * time.Duration(ttlDay) } bucket, err = js.CreateKeyValue(bucketConfig) if err != nil { return nil, err } } return &natsKV{ conn: conn, js: js, bucket: bucket, bucketName: bucketName, }, nil } // Get 获取键值 func (n *natsKV) Get(ctx context.Context, key string) ([]byte, error) { entry, err := n.bucket.Get(key) if err != nil { if err == nats.ErrKeyNotFound { return nil, err } return nil, err } return entry.Value(), nil } // Set 设置键值 func (n *natsKV) Set(ctx context.Context, key string, value []byte) error { _, err := n.bucket.Put(key, value) if err != nil { return err } return nil } // Delete 删除键值 func (n *natsKV) Delete(ctx context.Context, key string) error { err := n.bucket.Delete(key) if err != nil { if err == nats.ErrKeyNotFound { return err } return err } return nil } // List 列出所有键 func (n *natsKV) List(ctx context.Context, prefix string) ([]string, error) { keys, err := n.bucket.Keys() if err != nil { // 如果bucket是空的,返回空列表 if errors.Is(err, nats.ErrNoKeysFound) { return []string{}, nil } // 如果bucket不存在,返回空列表 if errors.Is(err, nats.ErrBucketNotFound) { return []string{}, nil } return nil, err } var result []string for _, key := range keys { if prefix == "" || len(key) >= len(prefix) && key[:len(prefix)] == prefix { result = append(result, key) } } return result, nil }
module glot-api go 1.24.5 require ( github.com/nats-io/nats.go master )
{ "command":"go mod tidy 2>/dev/null && go run main.go" }
Editor Settings
Theme
Key bindings
Full width
Lines