4.02 Go Web程序(1)|Go主题月

249 阅读2分钟

  前面几章介绍了如果书写一个简单的Godemo。对于一些简单的用法也算是入门,接下来我们就开始对于Web程序进行讲解,实现一个简单的Web程序。

包含以下知识点:

  • 使用loadsave方法创建数据结构
  • 使用net/http包构建web应用程序
  • 使用html/template包处理html模板
  • 使用regexp包验证用户输入
  • 使用闭包

基础知识:

  • 编程经验
  • 了解基本的网络技术(HTTP, HTML)
  • 一些UNIX/DOS命令行知识

代码编写

  基于之前的Go环境完成以下任务。

项目准备

  1. 创建项目目录。
    mkdir gowiki
    
  2. 创建出对应的主文件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}
}

  以上只是完成了部分准备,接下来我们还需要对文件的展示读取等等做很多操作,请各位看官老爷看下一章节。