继续接上一章节,完成我们的
go web
项目。
代码编写
loadPage
函数从title
参数构造文件名,将文件内容读入新的变量体,并返回一个指向用适当的title和body值构造的页面文字的指针。
函数可以返回多个值。标准库函数io
。ReadFile
返回字节数组和错误。在loadPage
中,错误还没有被处理;由下划线(_)符号表示的“空白标识符”用于丢弃错误返回值(实质上,将该值赋给空值)。
但是如果ReadFile
遇到错误怎么办?例如,该文件可能不存在。我们不应该忽视这样的错误。让我们修改函数以返回*Page
和错误。
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
该函数的调用者现在可以检查第二个形参;如果它是nil
,那么它已经成功地加载了一个页面。如果没有,它将是一个可以由调用者处理的错误(有关详细信息,请参阅语言规范)。
现在,我们有了一个简单的数据结构,并且能够将数据保存到文件中并从文件中加载。让我们写一个main
函数来测试我们所写的内容:
func main() {
p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
p1.save()
p2, _ := loadPage("TestPage")
fmt.Println(string(p2.Body))
}
编译并执行这段代码之后,将创建一个名为TestPage.txt
的文件,其中包含p1. txt
的内容。然后将该文件读入结构体p2
,并将其Body
元素打印到屏幕上。
接下来就可以译和运行程序:
[root@montos-prod gowiki]# go build wiki.go
[root@montos-prod gowiki]# ./wiki
This is a sample Page.
完整代码部分:
package main
import (
"fmt"
"io/ioutil"
)
type Page struct {
Title string
Body []byte
}
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
func main() {
p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
p1.save()
p2, _ := loadPage("TestPage")
fmt.Println(string(p2.Body))
}
总结
截止到目前,我们完成了一个命令行展示文件内容的案例,接下来就是需要将它变成一个web项目进行运行。