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
相关产品推荐
相关产品推荐

