Почему я могу опустить имя параметра в функции? - PullRequest
0 голосов
/ 07 февраля 2020

Я случайно написал что-то вроде этого кода (упрощенного до минимального примера):

func f(...interface{}) int {
    return 4
}

Я думаю, что это должно быть:

func f(args ...interface{}) int {
    return 4
}

Почему компилятор go позволяет версия без имени параметра и что это значит?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2020

Как упомянул Volker, это допускается языком spe c, и я понимаю ваше замешательство, для чего оно используется.

Когда вы не называете параметры, вы не можете получить доступ к их значениям. Но в редких случаях вам на самом деле не нужно. Если у вас есть интерфейс, который вы хотите реализовать, который объявляет параметры, но они не нужны для вашей реализации, тогда нет необходимости называть их, например, когда вы пишете mocks:

type Foo interface {
    Bar(string)
}

type MockFoo struct {}

func (MockFoo) Bar(string) {
    // Do nothing
}
3 голосов
/ 07 февраля 2020

Вы можете использовать параметры анонимной функции, например, в случае, если вы хотите удовлетворить интерфейс, но не получить доступ к рассматриваемому параметру.

Учитывая

package main

import "fmt"


type Greeter interface {
    // Note that the Greet function requires a parameter
    Greet(string) string
}

// GenericGreeter is the most basic Greeter.
type WorldGreeter struct {
}

// Greet satisfies the Greeter interface, which requires a string parameter for
// the Greet function.
func (g GenericGreeter) Greet(string) string {
    // Now, here is the thing: We do not access
    // the parameter, hence it can be anonymous.
    return "Hello, World!"
}

func PrintGreeting(g Greeter) {
    fmt.Println(g.Greet(""))
}

func main() {
    PrintGreeting(&GenericGreeter{})
}

Это было в значительной степени то же самое с вашим кодом: вы объявили параметр функции, но не использовали его.

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