4

Добрый день!

Подскажите, пожалуйста, по двум вопросам.

1) Можно ли в Go писать функции с необязательными параметрами? Типа как в PHP

function MyFunc($var1, $var2 = 1){}

2) Есть ли в Go возможность передавать значение переменной по ссылке? Опять же, как в PHP

function MyFunc($var1, &$var2){ $var2 = 1;}

После PHP этих приятных мелочей очень не хватает, а гугление что-то в этот раз не помогло.

Заранее спасибо!

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507

3 Answers3

5

1) Можно ли в Go писать функции с необязательными параметрами? Типа как в PHP

Точно также -- нет. Но есть пути обхода, своего рода костыли:

  1. Можно принимать переменное кол-во аргументов(func (params... interface{})), и тогда аргументы будут опциональными. Правда не именованными.
  2. Можно передавать словарь map[string]interface{}, немного громоздко, но иногда другого выхода нет.

2) Есть ли в Go возможность передавать значение переменной по ссылке? Опять-же как в PHP

В Go нет ссылок, но есть указатели. Передавайте по указателю.

UPD: пример использования указателя.

package main

import "fmt"

func f(i int) { ( i) = 2 }

func main() { i := 1 f(&i) fmt.Println(i) }

Напечатает 2.

Vladimir Gordeev
  • 5,396
  • 1
  • 24
  • 41
  • Указатель != ссылка. Изменяя ссылку в ф-и, изменения видны вне ф-и. Если присвоить новый адрес указателю внутри ф-и, адрес указателя во вне не изменится. Следовательно, для нужд, про которые говорил автор нельзя использовать указатели. – Nicolas Chabanovsky Jun 09 '12 at 09:42
  • 1
    Для чего нельзя их использовать? Я могу менять значения хранящиеся вне функции через указатели. Что ещё нужно? – Vladimir Gordeev Jun 09 '12 at 10:07
  • См. вопрос:
    function MyFunc($var1, &$var2){ $var2 = 1;}
    
    – Nicolas Chabanovsky Jun 09 '12 at 11:26
  • 1
    @Expert, всё можно. Добавил пример в ответ. – Vladimir Gordeev Jun 09 '12 at 11:38
  • Разадресация - это здорово, но речь шла совсем о другом.
    foo(a &A) {
        a = a1
    }
    
    

    и

    foo(a *A) {
        a = new(A)
    }
    
    

    Совсем разне разные.

    – Nicolas Chabanovsky Jun 09 '12 at 11:49
  • А, я понял вас.

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

    автор:

    Есть ли в Go возможность передавать значение переменной по ссылке? Опять же, как в PHP

    Ну да.

    – Vladimir Gordeev Jun 09 '12 at 12:32
  • 1
    Врядли автор хотел этого. – Vladimir Gordeev Jun 09 '12 at 12:44
3
  • опциональных параметров нету
  • функция должна возвращать значение, а не изменять аргумент
  • не стоит писать на одном языке в стиле другого языка
Spectre
  • 12,309
0

Мне кажется сделать параметр который не обязательно передавать в функцию не сложно. Значение поумолчанию можно прописать внутри. у меня получилось так: package main import "fmt" func addText(base string, opt ...string) (s string) { if len(opt) > 0 { base += opt[0] } else { base += "-" //хорошее место для обработки параметра поумолчанию } return base } func main() { fmt.Printf("%s\n", addText("info: ")) fmt.Printf("%s\n", addText("info: ", "done")) }

Пожалуйста не сильно ругайте, я новичёк на стековерфлоу...