Передача параметра в Go - PullRequest
       2

Передача параметра в Go

1 голос
/ 10 января 2012

Предположим, у меня есть метод типа http.HandleFunc

type HandlerFunc func(ResponseWriter, *Request)

И я хочу обернуть его вокруг другого метода того же типа, примерно так:

func MyWrapper(res http.ResponseWriter, req *http.Request) {

    // do stuff

    AnotherMethod(res, req) // <- question refers to this line

    // do more stuff

}

func AnotherMethod(res http.ResponseWriter, req *http.Request) {

    // main logic

}

Если я правильно понял; когда я вызываю AnotherMethod(res, req), я передаю копию из (значение) res в AnotherMethod, что означает, что этот объект теперь дублируется в памяти.

Есть ли способ, которым я мог бы передать указатель на res на AnotherMethod и затем разыменовать там, чтобы не копировать значение res? или я чего-то не понимаю?

(Работа с указателем на (значение) res внутри AnotherMethod не будет работать, поскольку получатели всех методов в http.ResponseWriter являются значениями, а не указателями)

1 Ответ

5 голосов
/ 10 января 2012

http.ResponseWriter - это тип интерфейса.Это означает, что это может быть как ссылочный тип, так и тип значения, в зависимости от того, что является базовым типом и как он реализует интерфейс.

В этом случае res является экземпляром неэкспортированного типа *http.response.Как вы можете видеть, это тип указателя, что означает, что вы можете передавать его, не создавая копию всей структуры.

Чтобы увидеть, какой реальный тип содержится в значении интерфейса, которое вы получаете, вы можетесделать это: fmt.Printf("%T\n", res).На нем должно быть напечатано: *http.resonse.

Для получения дополнительной информации о том, как типы интерфейсов работают в Go, я рекомендую прочитать спецификацию Go по этому вопросу.

...