Go'da, kaynakların bir CDN veya Nginx gibi HTTP sunucusu aracılığıyla ayrı ayrı sunulacağı normal bir web uygulamasının tam tersi olan küçük, bağımsız bir web uygulaması oluşturmak istedim. Bununla birlikte, performans kritik bir sorun değilse veya uygulama düşük trafiğe yönelikse, bağımsız bir uygulamanın kullanılması, yalnızca yürütülebilir bir ikili dosya olduğundan dağıtım ve dağıtımı basitleştirir. Kaynakları bir Go uygulamasına gömmek için çeşitli paketler mevcuttur: Pirinç Statik Bindata Her kütüphanenin ayrıntılarına girmeyeceğim ama kullanım kolaylığı ve aktif desteği nedeniyle yaklaşımını tercih ediyorum. bindata Başlarken Öncelikle projenizdeki dizini içinde bir oluşturalım: frontend/ index.html <html> <body> Hello, World! </body> </html> Artık bir proje kurulumumuz ve test edilecek statik bir kaynağımız olduğuna göre, şu komutu kullanarak yükleyelim: bindata'yı go get -u github.com/jteeuwen/go-bindata/... Web uygulamasının arka uç kodunu çalıştırmaya hazırız. Bir dosyası oluşturun ve aşağıdaki kodu kopyalayın: main.go package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) } Bu koddaki önemli satır: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... Yukarıdaki satır, çağrıldığında komutunu çalıştırmamızı sağlar. Sürüm 1.4'ten itibaren, oluşturma aşamasında özel komutları çalıştırabilirsiniz. Bu sadece go dosyanıza eklemek meselesidir. go generate go-bindata //go:generate command argument... komut satırının çeşitli parametreleri vardır, bu nedenle nasıl kullanılacağına ilişkin bakın. Bizim durumumuzda şöyle diyoruz: go-bindata belgelere statik için yol adının bir kısmını tanımlar -prefix "frontend/" oluşturulan kodda kullanılan paket adını tanımlar -pkg main oluşturulan dosyanın adını tanımlayın -o bindata.go komutunu çalıştırdıktan sonra adında oluşturulmuş bir dosya görmelisiniz. Projenizin yapısı şu şekilde görünmelidir: go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go Statik dosyaları sunma mantığı, isteği alan ve yolun statik yolla eşleşip eşleşmediğini kontrol eden işlevindedir. Kontrol, kullanıcısı tarafından otomatik olarak dışa aktarılan işlevi kullanılarak yapılır. Kaynak mevcut değilse değerini döndürürüz, aksi halde kaynağın içeriğini döndürürüz. static_handler bindata.go Asset 404 Kodun geri kalanı web uygulamasını oluşturmak ve şablonumuzu için gelen tüm isteklerle eşleşecek şekilde bağlamak içindir. Bu kodu anlamada sorun yaşıyorsanız için resmi Go bakın. static_handler / http package belgelerine Go'nun paketleri nasıl yönettiğine dair kısa bir hatırlatma olarak, tanımlayıcı adının ilk harfi büyük harfle başlıyorsa, tüm tanımlayıcılar aynı ada sahip diğer paketlere otomatik olarak aktarılacaktır. Bu kurala dayanarak dosyası paket için işlevini sağlar. Bu, verilen ad için bir varlık yükler ve döndürür. Kaynak bulunamazsa veya yüklenemezse hata döndürür. bindata.go main Asset