LINUX.ORG.RU

Сообщения rubefiya

 

Как правильно организовать код на Go

Форум — Development

Например, если создаем web-app в которой данные передаются в json формате, то:

Сначала нужно создать структуру

type JsonMessage struct {
	Type string
	Data json.RawMessage
}

Потом нужно создать под каждый запрос свою структуру

type ChatMessage struct {
	Username    string `json:"Username"`
	Message     string `json:"ConnectedTo"`
	ChatId      int    `json:"ChatId"`
}

Потом нужно создать обработчик

var msg JsonMessage
err = json.Unmarshal(message, &msg)
if err != nil {
	log.Println("Message decode failed")
	return
} 
switch msg.Type {
case "ChatMessage":
	{
		var cmsg ChatMessage
		err = json.Unmarshal(msg.Data, &cmsg)
		if err != nil {
			log.Println("Chat message decode failed")
			return
		}
		// ToDo ...
	}
	// ToDo ...
}

И в этом обработчике придется описать все возможные типы сообщений, в итоге код разрастается и становится трудным для понимания.

Посоветуйте что прочитать чтобы понять как правильно проектировать программу на Go, разбивать ее по файлам и модулям.

 

rubefiya
()

Зачем нужен SELinux?

Форум — Admin

Я не понимаю зачем он нужен. Говорят есть люди, которые настраивают SELinux так, что дают root доступ от своего ПК хакеру и не боятся что он испортит систему. Для этого SELinux?

 

rubefiya
()

Стиль кода

Форум — Development

Смотрю на официальный пример библиотеки mgo : https://labix.org/mgo

package main

import (
        "fmt"
	"log"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
)

type Person struct {
        Name string
        Phone string
}

func main() {
        session, err := mgo.Dial("server1.example.com,server2.example.com")
        if err != nil {
                panic(err)
        }
        defer session.Close()

        // Optional. Switch the session to a monotonic behavior.
        session.SetMode(mgo.Monotonic, true)

        c := session.DB("test").C("people")
        err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
	               &Person{"Cla", "+55 53 8402 8510"})
        if err != nil {
                log.Fatal(err)
        }

        result := Person{}
        err = c.Find(bson.M{"name": "Ale"}).One(&result)
        if err != nil {
                log.Fatal(err)
        }

        fmt.Println("Phone:", result.Phone)
}

Зачем делают так?

        result := Person{}
        err = c.Find(bson.M{"name": "Ale"}).One(&result)
        if err != nil {
                log.Fatal(err)
        }

Почему не так так?

        result := Person{} 
        result, err = c.Find(bson.M{"name": "Ale"}).One()
        if err != nil {
                log.Fatal(err)
        }

В чем смысл?

 ,

rubefiya
()

RSS подписка на новые темы