Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Хоть язык и не накладывает ограничений на структуру проекта, данное приложение я решил организовать по модели MVC
session := utils.NewDbSession()
defer session.Close()
c := session.Col(«posts»)
post := models.NewPost()
err := post.LoadById(id)
func (p *Post) Create() (id string, err *conf.ApiError) {
// validation
switch {
case p.UserId == "":
err = conf.ErrUserIdEmpty
case p.Body == "":
err = conf.ErrPostBodyEmpty
case utf8.RuneCountInString(p.Body) > conf.MAX_POST_CHARS:
err = conf.ErrPostMaxSize
case p.Geo.Coordinates[0] == 0.0 || p.Geo.Coordinates[1] == 0.0:
err = conf.ErrPostLocationEmpty
}
if err != nil {
return
}
p.Id = bson.NewObjectId()
p.Geo.Type = "Point"
p.Enabled = true
p.Date = time.Now()
session := utils.NewDbSession()
defer session.Close()
c := session.Col("posts")
errDb := c.Insert(p)
if errDb != nil {
return "", conf.NewApiError(errDb)
}
p.UpdParentComments()
return p.Id.Hex(), nil
}
func midRequestValues(c martini.Context, req *http.Request) {
values := &ReqValues{}
c.Map(values)
}
func (s *Sprockets) SetFuncMap(funcMap template.FuncMap) {
funcMap["asset_path"] = s.AssetPath
}
func App() *martini.Martini {
m := martini.New()
// Setup default middleware
m.Use(martini.Recovery())
r := martini.NewRouter()
r.NotFound(func() (int, string) {
return 404, wutapi.Error404()
})
// Add the router action
m.Action(r.Handle)
return m
}
func Test_Applications_GetAll(t *testing.T) {
res := httptest.NewRecorder()
req := makeReq("GET", "/v1/oauth2/applications")
App().ServeHTTP(res, req)
assert.Equal(t, res.Code, 200, "they should be equal")
}
Язык создавался с прицелом на веб-разработкуОтчего же? Насколько мне известно, он задуман как язык общего назначения.
Это не фишка языка, а, скорее, редактора кода.
2. Создание форматтеров для дат. Вам нужно передать строку в которой будет записана дата «Mon Jan 2 15:04:05 MST 2006» в формате, который вам нужен (например «02.01.06»). По-моему гениально :)
Полиморфизм реализуется интерфейсами, которые не нужно явно имплементировать, а лишь достаточно реализовать методы интерфейса.
Скорость и компиляция. Скорость у Go в десятки раз быстрее, чем у скриптовых языков, при меньшем потреблении памяти. При этом, компиляция практически мгновенна. Весь проект компилируется в один бинарный файл, без зависимостей. Как говорится, «просто добавь воды». И вам не надо заботиться о памяти, есть сборщик мусора.
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
func NewField(w, h int) *Field {
s := make([][]bool, h)
for i := range s {
s[i] = make([]bool, w)
}
return &Field{s: s, w: w, h: h}
}
Package fmt implements formatted I/O with functions analogous
to C's printf and scanf.
import myfmt "fmt" и использовать в коде вместо fmt — myfmt.import foo as bar

Талисман у Go — дурацкий какой-то, само имя — тоже (приходится искать не "{langName}", а "{langName} programming language").
А зачем при импорте имя модуля в кавычках? Там что, можно использовать переменные?
А эти * и & перед именами переменных напоминают сишечку (так не лучше ли на си и писать?)
import "github.com/go-martini/martini"Если либа переедет с гитхаба на битбакет, то что, исходники что ли править?
Язык Go для начинающих