4.03 Go Web程序(2)|Go主题月

289 阅读2分钟

  继续接上一章节,完成我们的go web项目。

代码编写

loadPage函数从title参数构造文件名,将文件内容读入新的变量体,并返回一个指向用适当的title和body值构造的页面文字的指针。

函数可以返回多个值。标准库函数ioReadFile返回字节数组和错误。在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项目进行运行。