go

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

// 网站信息结构体
type Website struct {
    Name        string `json:"name"`
    URL         string `json:"url"`
    Description string `json:"description"`
}

// 网站导航列表
var websites []Website

func main() {
    // 加载网站数据
    loadWebsites()

    // 创建 HTTP 服务器
    http.HandleFunc("/", handleIndex)
    http.HandleFunc("/add", handleAdd)
    http.HandleFunc("/delete", handleDelete)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

// 处理主页请求
func handleIndex(w http.ResponseWriter, r *http.Request) {
    // 渲染主页模板
    data := map[string]interface{}{
        "Websites": websites,
    }
    renderTemplate(w, "index.html", data)
}

// 处理添加网站请求
func handleAdd(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        // 获取表单数据
        name := r.FormValue("name")
        url := r.FormValue("url")
        description := r.FormValue("description")

        // 创建新的网站对象
        newWebsite := Website{
            Name:        name,
            URL:         url,
            Description: description,
        }

        // 添加到列表
        websites = append(websites, newWebsite)

        // 保存数据
        saveWebsites()

        // 重定向到主页
        http.Redirect(w, r, "/", http.StatusFound)
    } else {
        renderTemplate(w, "add.html", nil)
    }
}

// 处理删除网站请求
func handleDelete(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        // 获取要删除的网站 ID
        id := r.FormValue("id")

        // 从列表中删除网站
        for i, website := range websites {
            if website.Name == id {
                websites = append(websites[:i], websites[i+1:]...)
                break
            }
        }

        // 保存数据
        saveWebsites()

        // 重定向到主页
        http.Redirect(w, r, "/", http.StatusFound)
    }
}

// 加载网站数据
func loadWebsites() {
    // 从 JSON 文件加载数据
    data, err := ioutil.ReadFile("websites.json")
    if err != nil {
        log.Fatal(err)
    }

    // 解析 JSON 数据
    err = json.Unmarshal(data, &websites)
    if err != nil {
        log.Fatal(err)
    }
}

// 保存网站数据
func saveWebsites() {
    // 序列化网站数据为 JSON
    data, err := json.MarshalIndent(websites, "", "  ")
    if err != nil {
        log.Fatal(err)
    }

    // 将 JSON 数据写入文件
    err = ioutil.WriteFile("websites.json", data, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

// 渲染模板
func renderTemplate(w http.ResponseWriter, filename string, data interface{}) {
    // 加载模板
    tmpl, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Fatal(err)
    }

    // 渲染模板
    err = template.Must(template.New(filename).Parse(string(tmpl))).Execute(w, data)
    if err != nil {
        log.Fatal(err)
    }
}

使用方法:

  1. 创建一个名为 websites.json 的文件,并添加一些网站信息。以下是一个示例:

Json 复制



[
  {
    "name": "Google",
    "url": "https://www.google.com",
    "description": "搜索引擎"
  },
  {
    "name": "Facebook",
    "url": "https://www.facebook.com",
    "description": "社交网络"
  }
]

  1. 运行 go run main.go 命令启动服务器。
  2. 打开浏览器访问 http://localhost:8080 即可访问网站导航页面。

功能说明:

  • 主页: 显示所有网站的列表,包括网站名称、链接和描述。
  • 添加网站: 可以添加新的网站到列表中。
  • 删除网站: 可以从列表中删除网站。

代码说明:

  • Website 结构体用于存储网站信息。
  • websites 变量用于存储所有网站信息。
  • loadWebsites() 函数用于从 websites.json 文件加载网站数据。
  • saveWebsites() 函数用于将网站数据保存到 websites.json 文件。
  • handleIndex() 函数处理主页请求,并渲染 index.html 模板。
  • handleAdd() 函数处理添加网站请求,并将新的网站添加到 websites 列表中。
  • handleDelete() 函数处理删除网站请求,并从 websites 列表中删除网站。
  • renderTemplate() 函数用于渲染模板。

注意:

  • 为了运行这个程序,你需要安装 Go 语言开发环境。
  • 确保 index.htmladd.htmlwebsites.json 文件存在于与 main.go 文件相同的目录中。
  • 你可以根据自己的需求修改代码,例如添加新的功能或修改界面。

标签: golang, 程序, 网址, Gemini, 导航

添加新评论