Go语言备忘——定义使用自定义包、接口、方法的简单示例

我才开始学习Go语言,这里记录一个自己编写的简单示例。本示例涉及自定义包,结构体设置默认值,以及面向对象编程中的接口、方法的定义使用。示例工程不在GOPATH下创建,可在任意目录下创建。


Ubuntu 18.04
Go 1.14.4
Visual Studio Code 1.45.1


首先创建下面的目录结构(那3个.go文件先不管),创建位置随意,不需要在GOPATH下。

clover
├── cmd
│    └── clover
│        └── clover.go
├── internal
│        ├── webgenerator
│        │     └── webgenerator.go
│        └── webserver
│                 └── webserver.go
├── pkg
└── test

其中cmd文件夹用来存放主程序;internal文件夹用来存放自定义的包,并且这些包只用在本工程内;pkg文件夹也用来存放包,但是这些包可能会用在其他地方,在本示例中,这个文件夹不会使用;test文件夹用来存放做黑盒测试的脚本命令,在本示例中也不会使用。

创建好目录后,在clover目录(工程根目录,不是cmd里面那个)下执行以下命令:

go mod init clover

执行后会生成go.mod文件,内容如下:

module clover

go 1.14

接下来分别编写clover.go、webserver.go与webgenerator.go三个代码文件。内容分别如下:

main.go

// CSDN陆巍的博客
package main

import (
	"clover/internal/webgenerator"
	"clover/internal/webserver"
)

func main() {
	var page webserver.PageData

	page = new(webgenerator.WebGenerator)
	web := webserver.NewWebServer(page)
	web.SetResponse("/")

	web.Run()
}

webserver.go

// CSDN陆巍的博客
package webserver

import (
	"log"
	"net/http"
	"time"

	"github.com/gorilla/mux"
)

// PageData 页面数据接口
type PageData interface {
	GenerateWeb() string
}

// WebServer webServer结构的接口
type WebServer interface {
	SetResponse(path string)
	Run()
}

// webServer Web服务器
type webServer struct {
	Router *mux.Router
	Svr    http.Server
	Page   PageData
}

// NewWebServer 创建webServer实例,设置默认值
func NewWebServer(page PageData) WebServer {
	r := mux.NewRouter().StrictSlash(false)
	svr := http.Server{
		Addr:         ":8000",
		ReadTimeout:  10 * time.Second,
		WriteTimeout: 10 * time.Second,
		Handler:      r,
	}
	return webServer{r, svr, page}
}

// SetResponse 设置响应
func (p webServer) SetResponse(path string) {
	p.Router.HandleFunc(path, p.sendData).Methods("GET")
}

// sendPage 发送数据
func (p webServer) sendData(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(p.Page.GenerateWeb()))
}

// Run 运行服务器
func (p webServer) Run() {
	log.Fatal(p.Svr.ListenAndServe())
}

webgenerator.go

// CSDN陆巍的博客
package webgenerator

import "time"

// WebGenerator 网页生成器
type WebGenerator struct {
}

// GenerateWeb 生成网页
func (p WebGenerator) GenerateWeb() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

使用以下命令进行编译:

go build cmd/clover/clover.go

成功编译后,会在clover根目录下生成clover可执行文件。运行clover程序后,可以在地址http://localhost:8000下看到当前时间的显示,并且每次刷新后数值都会随着时间而改变。如下图:
Go语言备忘——定义使用自定义包、接口、方法的简单示例_第1张图片


注意点:

  1. 调用自定义包的路径"clover/internal/webserver",是以git mod init命令初始化时的模块名称为基础的。
  2. 在clover.go程序中调用自定义包里面的东西时,与调用其他包一样,需要在前面加上包名前缀,例如“webserver.”。
  3. 为了给结构体webServer设置默认值,代码中使用了WebServer接口。
  4. 为了让webserver与webgenerator之间没有依赖,使用了接口PageData。在主程序调用时,WebGenerator被“挂载”上webServer中,为web服务器提供网页数据。不把二者放在一处,是因为向web服务器提供数据的方式有多种,例如可能是直接读HTML文件,生成静态网页;又可能是使用模板控制等等。
  5. 通常包名与所在目录名相同。

你可能感兴趣的:(Go语言)