在 Golang 中实现在线编辑 YAML 是可行的,可以使用 Web 框架(如 Gin 或 Echo)和 YAML 库(如 go-yaml 或 gopkg.in/yaml.v2)来实现。以下是一个示例程序,展示如何使用 Gin 框架和 go-yaml 库实现在线编辑 YAML:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"

    "github.com/gin-gonic/gin"
    "gopkg.in/yaml.v2"
)

type Config struct {
    Server struct {
        Host string `yaml:"host"`
        Port int    `yaml:"port"`
    } `yaml:"server"`
    Database struct {
        Host     string `yaml:"host"`
        Port     int    `yaml:"port"`
        Username string `yaml:"username"`
        Password string `yaml:"password"`
    } `yaml:"database"`
}

func main() {
    // 加载 YAML 文件
    yamlFile, err := ioutil.ReadFile("config.yaml")
    if err != nil {
        panic(fmt.Sprintf("Error reading YAML file: %v", err))
    }

    // 解析 YAML 数据到 Config 结构体中
    var config Config
    if err := yaml.Unmarshal(yamlFile, &config); err != nil {
        panic(fmt.Sprintf("Error parsing YAML data: %v", err))
    }

    // 创建 Gin 实例
    r := gin.Default()

    // 定义路由
    r.GET("/", func(c *gin.Context) {
        c.YAML(http.StatusOK, config)
    })

    r.POST("/", func(c *gin.Context) {
        // 从请求中读取 YAML 数据
        yamlData, err := ioutil.ReadAll(c.Request.Body)
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid YAML data"})
            return
        }

        // 解析 YAML 数据到 Config 结构体中
        var newConfig Config
        if err := yaml.Unmarshal(yamlData, &newConfig); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid YAML data"})
            return
        }

        // 将新的配置保存到 YAML 文件中
        newYamlData, err := yaml.Marshal(newConfig)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
            return
        }

        if err := ioutil.WriteFile("config.yaml", newYamlData, 0644); err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
            return
        }

        // 更新 Config 结构体中的数据
        config = newConfig

        c.JSON(http.StatusOK, gin.H{"message": "Config updated successfully"})
    })

    // 启动服务器
    if err := r.Run(":8080"); err != nil {
        panic(fmt.Sprintf("Error starting server: %v", err))
    }
}
ConfigConfigconfig

你可以使用以下命令运行此程序:

go run main.go
http://localhost:8080curl
# 查看当前的 YAML 配置
curl http://localhost:8080

# 更新配置
curl -X POST -d "server:\n  host: localhost\n  port: 8000\n\ndatabase:\n  host: localhost\n  port: 5432\n  username: user\n  password: password" http://localhost:8080

这是一个基本的示例,你可以根据自己的需要进行修改和扩展。