编写Web应用的前提介绍
在编写一样的时候我们会经历下面几个部分
- 创建一个数据结构,并定义一个加载数据和存储数据的方法
- 使用net/http包来构建Web应用
- 使用html/template包处理HTML模板
- 使用正则regexp包来校验用户的输入
- 使用闭包closures
假设你已经掌握了如下知识:
- 已经有了编写程序的经验
- 了解web基础的web技术,包括(HTTP,HTML)
- 会一些UNIX/DOS命令行知识
应用程序搭建
需要使用FreeBSD,Linux,OS X或Windows机器来运行Go。如果还不会安装的话请转到(Go基础学习记录 - 安装)[https://www.xiaorongmao.com/blog/2]
在GOPATH中创建一个新目录并cd到目录中:
mkdir wiki
cd wiki
比如我的项目目录路径如下
/Users/durban/go/src/github.com/durban.zhang/wiki
创建一个名为wiki.go的文件,并用您喜欢的编辑器中打开它,并添加以下行:
package main
import (
"fmt"
"io/ioutil"
)
我们从Go标准库导入fmt和ioutil包。后面,当实现其他功能时,我们将向此导入声明添加更多包。
数据结构
首先从定义数据结构开始。wiki由一系列互连的页面组成,每个页面都有一个Title和一个Body(页面内容)。
在这里,我们将Page定义为一个结构,其中两个字段代表标题和正文。如下
type Page struct {
Title string
Body []byte
}
[]byte 表示"字节切片"。Body元素使用[]byte而不是字符串,是因为我们将使用的io库,它所期望的类型是[]byte。
Page结构描述了页面数据将如何存储在内存中。如果要将数据持久的进行存储的话,需要在Page上创建一个一个save方法来解决这个问题。如下
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
这是一个名为save的方法,它将接收器p作为指向Page的指针。它不接受任何参数,并返回类型错误的值。
此方法将Page的Body保存为文本文件。为简单起见,将使用Title作为文件名。
save方法返回一个错误值,因为这是WriteFile的返回类型(一个将字节切片写入文件的标准库函数)。
save方法返回错误值,让应用程序在写入文件时出错。
如果一切顺利,Page.save()将返回nil(指针,接口和其他类型的零值)。
作为WriteFile的第三个参数传递的八进制整数文字0600表示应该仅为当前用户创建具有读写权限的文件。除了保存页面,我们还想加载页面。方法如下:
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, error := ioutil.ReadFile(filename)
if error != nil {
return nil, error
}
return &Page{Title: title, Body: body}, nil
}
函数loadPage从title参数构造文件名,将文件的内容读入新的变量体,并返回指向使用正确的标题和正文值构造的Page文本的指针。
此函数在调用者调用的时候可以通过检查第二个参数,如果是nil那么它已经成功加载了一个Page。如果不是,则调用者可以处理错误
此时,我们有一个简单的数据结构,能够保存到文件并从中加载。
还需要编写一个主函数来测试我们编写的内容,如下:
func main() {
p1 := &Page{
Title: "Test Title",
Body: []byte("Test Body"),
}
p1.save()
p2, _ := loadPage("Test Title")
fmt.Println(string(p2.Body))
}
编译并执行此代码后,将创建一个名为TestPage.txt的文件,其中包含p1的内容。
然后将该文件读入struct p2,并将其Body元素打印到屏幕上。
可以像下面这样编译并运行
$go build wiki.go
$./wiki
Test Body
版权声明
由 durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。