前面几章介绍了如果书写一个简单的
Godemo。对于一些简单的用法也算是入门,接下来我们就开始对于Web程序进行讲解,实现一个简单的Web程序。
包含以下知识点:
- 使用
load和save方法创建数据结构 - 使用
net/http包构建web应用程序 - 使用
html/template包处理html模板 - 使用
regexp包验证用户输入 - 使用闭包
基础知识:
- 编程经验
- 了解基本的网络技术(
HTTP,HTML) - 一些
UNIX/DOS命令行知识
代码编写
基于之前的
Go环境完成以下任务。
项目准备
- 创建项目目录。
mkdir gowiki - 创建出对应的主文件
wiki.go。package main import ( "fmt" "io/ioutil" )
数据结构体
让我们从定义数据结构开始。wiki由一系列相互连接的页面组成,每个页面都有一个标题和正文(页面内容)。这里,我们将Page定义为一个具有两个字段的结构体,分别表示标题和正文。
type Page struct {
Title string
Body []byte
}
byte[]字节表示a byte slice。(有关slice的更多信息,请参见:用法和内部组件)Body元素是[]字节而不是字符串,因为这是我们将使用的io库的类型,下面会见到。
页结构描述页数据将如何存储在内存中。但是持久化存储呢?我们可以通过在页面上创建一个保存方法来解决这个问题:
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
这个方法代表:这是一个名为save的方法,它以一个指向Page的指针p作为它的接收者。它不接受参数,并返回类型为error的值。
这个方法将把页面的正文保存到一个文本文件中。为简单起见,我们将使用标题作为文件名。
save方法返回一个错误值,因为这是WriteFile(一个将字节片写入文件的标准库函数)的返回类型。save方法返回错误值,以便应用程序在编写文件时处理任何错误。如果一切顺利,Page.save()将返回nil(指针、接口和一些其他类型的零值)。
八进制整数字面量0600作为WriteFile的第三个参数传递,表示创建文件时应该只对当前用户具有读写权限。(请参阅Unix手册页open(2)了解详细信息。)
除了保存页面,我们还想加载页面:
func loadPage(title string) *Page {
filename := title + ".txt"
body, _ := ioutil.ReadFile(filename)
return &Page{Title: title, Body: body}
}
以上只是完成了部分准备,接下来我们还需要对文件的展示读取等等做很多操作,请各位看官老爷看下一章节。