Странное поведение с использованием параметров интерфейса - PullRequest
0 голосов
/ 22 апреля 2019

Когда я вызываю функцию с interface{} параметрами с *[]interface{}, поведение ожидается, но когда я вызываю функцию с []interface{}, а затем использую параметр с &, это не работает почему?

func routeWarehouses(engine *gin.Engine) {
    var test []database.Warehouses
    router.GET("/", genericReads(test))
}

func genericReads(i interface{}) func(c *gin.Context) {
    return func(c *gin.Context) {
        // When i call genericReads with `test`
        //println(reflect.TypeOf(i).Kind()) // Slice
        //println(reflect.TypeOf(i).Elem().Kind()) // Struct

        // When i call genericReads `&test`
        //println(reflect.TypeOf(i).Kind()) // Ptr
        //println(reflect.TypeOf(i).Elem().Kind()) // Slice
        //println(reflect.TypeOf(i).Elem().Elem().Kind()) // Struct

        // When I call database.Reads with `i` ( passed as `&test` ), It's works, I get all rows of the Model otherwise
        // When I call database.Reads with `&i` ( passed as `test` ), It doesn't work ( I get `unsupported destination, should be slice or struct` )
        if err := database.Reads(&i, database.Warehouses{}); err != nil {
            utils.R500(c, err.Error())
            return
        }

        c.JSON(http.StatusOK, i)
    }
}
func Reads(i interface{}, column ColumnSpell) error {
    if err := DB.Debug().Find(i).Error; err != nil {
        return errors.New(fmt.Sprintf("Cannot reads %s: %s", column.Plural(), err.Error()))
    }

    return nil
}

PS: Может быть, это прямо из Горм?

1 Ответ

1 голос
/ 22 апреля 2019

Это потому, что срез уже является указателем (https://golang.org/ref/spec#Slice_types).

). Поэтому, чтобы установить указатель на срез, нужно установить указатель на указатель.в массивы.

Более подробную информацию о том, как фрагменты используются в качестве указателя, можно найти здесь: https://golang.org/doc/effective_go.html#slices

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...