You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言:ASCII艺术生成与服务端分离及网页输出方案问询

解决方案

1. 分离ASCII艺术转换逻辑

把转换代码抽成独立的本地包,既能解耦代码,也方便后续复用:

  • 新建asciiart目录,在其中创建asciiart.go:
package asciiart

// Convert 将输入字符串转为ASCII艺术,返回每行内容的切片
func Convert(input string) []string {
    // 这里替换成你实际的ASCII转换逻辑
    // 示例生成逻辑:
    var artLines []string
    artLines = append(artLines, "  ====== ")
    artLines = append(artLines, " |  "+input+"  |")
    artLines = append(artLines, "  ====== ")
    return artLines
}
  • 在server.go中导入这个本地包,处理表单时直接调用转换函数:
package main

import (
    "fmt"
    "net/http"
    "你的项目根路径/asciiart" // 替换为实际项目路径
)

func main() {
    http.HandleFunc("/", formHandler)
    fmt.Println("服务启动在 :8080")
    http.ListenAndServe(":8080", nil)
}

func formHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
        // 返回输入表单页面
        fmt.Fprintf(w, `
            <html>
                <body>
                    <form method="post">
                        输入内容:<input type="text" name="content">
                        <button type="submit">生成ASCII艺术</button>
                    </form>
                </body>
            </html>
        `)
        return
    }

    // 获取表单输入值
    userInput := r.FormValue("content")
    // 调用独立包的转换函数
    asciiResult := asciiart.Convert(userInput)

    // 调用展示逻辑返回结果页面
    showASCIIResult(w, asciiResult)
}

2. 在网页上正确展示ASCII艺术

ASCII艺术依赖等宽字体和格式保留,用HTML的<pre>标签可以完美解决排版问题:

方法1:直接拼接HTML(新手快速上手)

在server.go中添加展示函数:

func showASCIIResult(w http.ResponseWriter, lines []string) {
    // 将切片转为带换行的字符串
    artContent := ""
    for _, line := range lines {
        artContent += line + "\n"
    }

    // 用<pre>包裹内容,确保格式不混乱
    resultHTML := fmt.Sprintf(`
        <html>
            <body>
                <h3>生成结果:</h3>
                <pre>%s</pre>
                <p><a href="/">返回重新输入</a></p>
            </body>
        </html>
    `, artContent)

    // 设置响应类型为HTML
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    fmt.Fprint(w, resultHTML)
}

方法2:使用Go模板(更规范,适合后续扩展)

  • 新建templates目录,创建result.html模板文件:
<!DOCTYPE html>
<html>
<body>
    <h3>生成结果:</h3>
    <pre>{{.ArtContent}}</pre>
    <p><a href="/">返回重新输入</a></p>
</body>
</html>
  • 修改展示函数为模板渲染方式:
import "html/template"

func showASCIIResult(w http.ResponseWriter, lines []string) {
    artContent := ""
    for _, line := range lines {
        artContent += line + "\n"
    }

    // 解析模板文件
    tmpl, err := template.ParseFiles("templates/result.html")
    if err != nil {
        http.Error(w, "加载模板失败", http.StatusInternalServerError)
        return
    }

    // 传递数据到模板
    templateData := struct {
        ArtContent string
    }{
        ArtContent: artContent,
    }

    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    tmpl.Execute(w, templateData)
}

内容的提问来源于stack exchange,提问作者escode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:01:21