Всем привет!
Недавно начал изучение го, и хотя все вобщем-то понятно, но новый подход к четкому разделению данных и логики немного обескураживает. Вот что конкретно мне нужно:
При использовании библиотеки net/http нужно абстрагироваться от некоторых вызовов, сделать инициализацию за кулисами так сказать, код скажет больше:
package main
import (
"fmt"
"net/http"
)
type HttpRequest struct {
url string
client http.Client
request http.Request
ready bool
}
func ClientInit() http.Client {
client := http.Client{}
return client
}
func RequestInit(url string) *http.Request {
req, _ := http.NewRequest("GET", url, nil)
ua := "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.0.16"
req.Header.Add("User-Agent", ua)
return req
}
func (h_req *HttpRequest) Perform(path string) (*http.Response, error) {
if !h_req.ready {
h_req.client = ClientInit()
h_req.request = *RequestInit(h_req.url)
h_req.ready = true
}
h_req.request.URL.Path = path
return h_req.client.Do(&h_req.request)
}
func main() {
h_req := HttpRequest{ url: "http://example.com" }
resp, _ := h_req.Perform("/hello.html")
resp, _ = h_req.Perform("/world.html")
fmt.Println(resp)
}
В функции ClientInit я опустил некоторые действия для краткости, вообщем мне нужно всего два действия это инициализация кастомной структуры HttpRequest с параметром url, и экшен над этой структурой Perform который принимает url_path и отдает http.Response. Код попахивает, но какие рекомендации по улучшению вы можете посоветовать в плане архитектуры. Еще по ходу написания этого топика возникло желание объединить RequestInit и ClientInit в одну функцию.