Эквивалентно передаче Java объекта в качестве параметра метода в GoLang - PullRequest
0 голосов
/ 17 октября 2018

Предположим, мне надоело набирать System.out.println(message) во всех местах, я ввожу метод в java, который выглядит как

private void print (Object message) {
   System.out.println(message);
}

, и я вызываю print (2) & print ("hi") в java, где это необходимо.

Можно ли добиться того же в GoLang?Функция примерно такая

func print(message ) {
    fmt.Println (message)
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Go - это язык процедурного программирования со множеством функциональных программ элементов.

Функции являются первоклассными типами в Go, вы можете создавать переменные типа функции,и вы можете назначить значения функций этим переменным, и вы можете вызвать их (значение функции сохранено в них).

Таким образом, вы можете просто сделать:

var myprint = fmt.Println

myprint("Hello, playground")
myprint(1, 3.14, "\n", time.Now())

Вывод вышеупомянутого (попробуйте на Go Playground ):

Hello, playground
1 3.14 
 2009-11-10 23:00:00 +0000 UTC m=+0.000000001

Преимущество указанной выше переменной myprint заключается в том, что она будет иметь такую ​​же сигнатуру, что и fmt.Println()Это:

func Println(a ...interface{}) (n int, err error)

Да, мы также можем создать функцию-оболочку, например:

func myprint(a ...interface{}) (n int, err error) {
    return fmt.Println(a...)
}

И она будет работать так же, как и вызов fmt.Println(), но использование переменнойменее многословно, и имеет то преимущество, что вы можете изменить значение функции во время выполнения , что очень удобно при написании тестов (например, см. Тестирование os.Exit сценариев в Go с информацией покрытия)(coveralls.io/Goveralls)).

Mпо теме:

Дейв Чейни: не бойтесь функций первого класса

golangbot.com: Функции первого класса

Еще одна возможность заключается в использовании «точечного импорта», но я советую против этого:

import (
    . "fmt"
)

func main() {
    Println("Hello, playground")
}

Когда вы используете «точечный импорт», все экспортированные идентификаторы импортированного пакета становятся доступными без использования квалифицированных идентификаторов .Цитирование из Spec: Импорт объявлений:

Если вместо имени появляется явный период (.), все экспортированные идентификаторы пакета, объявленные в пакете этого пакетаблок будет объявлен в блоке файла импортирующего исходного файла и должен быть доступен без квалификатора.

0 голосов
/ 17 октября 2018

Вы пробовали использовать interface?

func print(obj interface{}) {
 // logic
}

Таким образом, вы можете принимать все, что хотите.

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