Я только начинаю работать с Go и пытаюсь научиться создавать простые веб-приложения без использования сторонних библиотек/пакетов.
Используя этот пост и этот код в качестве руководства, я взломал следующее вместе:
package main
import (
"bytes"
"net/http"
"os"
"path"
"time"
)
type StaticFS map[string]*staticFile
type staticFile struct {
name string
data []byte
fs StaticFS
}
func LoadAsset(name string, data string, fs StaticFS) *staticFile {
return &staticFile{name: name,
data: []byte(data),
fs: fs}
}
func (fs StaticFS) prepare(name string) (*staticFile, error) {
f, present := fs[path.Clean(name)]
if !present {
return nil, os.ErrNotExist
}
return f, nil
}
func (fs StaticFS) Open(name string) (http.File, error) {
f, err := fs.prepare(name)
if err != nil {
return nil, err
}
return f.File()
}
func (f *staticFile) File() (http.File, error) {
type httpFile struct {
*bytes.Reader
*staticFile
}
return &httpFile{
Reader: bytes.NewReader(f.data),
staticFile: f,
}, nil
}
//implement the rest of os.FileInfo
func (f *staticFile) Close() error {
return nil
}
func (f *staticFile) Stat() (os.FileInfo, error) {
return f, nil
}
func (f *staticFile) Readdir(count int) ([]os.FileInfo, error) {
return nil, nil
}
func (f *staticFile) Name() string {
return f.name
}
func (f *staticFile) Size() int64 {
return int64(len(f.data))
}
func (f *staticFile) Mode() os.FileMode {
return 0
}
func (f *staticFile) ModTime() time.Time {
return time.Time{}
}
func (f *staticFile) IsDir() bool {
return false
}
func (f *staticFile) Sys() interface{} {
return f
}
func main() {
const HTML = `<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<main>
<p>Hello World</p>
</main>
</body>
</html>
`
const CSS = `
p {
color:red;
text-align:center;
}
`
ASSETS := make(StaticFS)
ASSETS["index.html"] = LoadAsset("index.html", HTML, ASSETS)
ASSETS["style.css"] = LoadAsset("style.css", CSS, ASSETS)
http.Handle("/", http.FileServer(ASSETS))
http.ListenAndServe(":8080", nil)
}
Который компилируется нормально, но на самом деле не дает никаких результатов, кроме 404, страница не найдена.
Чего я хочу добиться, так это иметь пакет в своем приложении, который позволяет мне создавать карту, вставлять в нее некоторый статический контент, такой как css и js, а затем обслуживать его с помощью http.Handle. Без использования сторонних инструментов, таких как go-bindata, рис или что-то еще.
Любая помощь будет принята с благодарностью.