LINUX.ORG.RU

Стиль кода

 ,


1

2

Смотрю на официальный пример библиотеки 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)
        }

В чем смысл?

Это не стиль кода, это ограничения языка.

Библиотека в предложенном твоем случае может вернуть только interface{}, а поэтому тебе придется самому кастовать это в Person, что геморрой и дополнительные проверки.

Просто передать внутрь указатель проще и для вызывающего кода, и для вызываемого.

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Библиотека в предложенном твоем случае может вернуть только interface{}, а поэтому тебе придется самому кастовать это в Person, что геморрой и дополнительные проверки.

Да ну?


package main

import (
	"fmt"
)

type Person struct {
        Name string
        Phone string
}

func Func1() Person {
	return Person {"Name", "+3123"}
}

func main() {
	result := Person{} 
	result = Func1()
	fmt.Println(result)	
}


rubefiya
() автор топика
Ответ на: комментарий от rubefiya

mgo возвращает interface{} и может работать с любым типом.

Твоя функция может возвращать только один тип - Person.

Как ты предлагаешь решить эту проблему? Добавлять в библиотеку функции для всех типов своих моделей?

derlafff ★★★★★
()

Смысл в том, что в го нет обобщений, потому написать универсальную функцию .One() невозможно.

nikolnik ★★★
()

А какой тип будет у result? man reflection.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.