Возможно ли в Go удалить переменную после создания?

740 views
Skip to first unread message

Павел Поляков

unread,
Jan 21, 2014, 3:12:52 PM1/21/14
to gola...@googlegroups.com
Привет,

Возможно ли в Go сделать что-то типа unset для переменной?
Чтобы в дальнейшем создать ее вновь.

Имеется в виду следующее:

  results := make(map[string]string)
 
r, _ := regexp.Compile("paid_y_12=(?P<match>[0-9])<br>")
captures := r.FindStringSubmatch(text)

results["paid_y_12"] = captures[1]

        // здесь самое время удалить переменные r и captures, используя какой-то аналог PHP unset
 
r, _ := regexp.Compile("paid_n_12=(?P<match>[0-9])<br>")
captures := r.FindStringSubmatch(text)
results["paid_n_12"] = captures[1]
 
Очень хочу продолжать назначать значения переменным через := , не хочу осознавать то, что они уже были созданы.

Возможно ли это реализовать в Go?

Находил функцию delete(), но она только для работы с map-ами.

Подскажите плз.

Спасибо

Orlovsky Alexander

unread,
Jan 21, 2014, 4:23:13 PM1/21/14
to gola...@googlegroups.com


среда, 22 января 2014 г., 0:12:52 UTC+4 пользователь Павел Поляков написал:
Привет,

Возможно ли в Go сделать что-то типа unset для переменной?
Чтобы в дальнейшем создать ее вновь.

Имеется в виду следующее:

  results := make(map[string]string)
 
r, _ := regexp.Compile("paid_y_12=(?P<match>[0-9])<br>")
captures := r.FindStringSubmatch(text)

results["paid_y_12"] = captures[1]

        // здесь самое время удалить переменные r и captures, используя какой-то аналог PHP unset

Не надо думать о том что и как в PHP, когда пишете на Go, станет проще жить.
 
 
r, _ := regexp.Compile("paid_n_12=(?P<match>[0-9])<br>")
captures := r.FindStringSubmatch(text)
results["paid_n_12"] = captures[1]
 
Очень хочу продолжать назначать значения переменным через := , не хочу осознавать то, что они уже были созданы.

Что мешает использовать просто "=" (оператор присвоения)?
 

Возможно ли это реализовать в Go?


К счастью, нет. В Go удалять уже объявленные переменные нельзя. (Удивлен что в каких-то распространенных "языках программирования" это вообще возможно.)

Павел Поляков

unread,
Jan 21, 2014, 4:55:53 PM1/21/14
to gola...@googlegroups.com
Просто есть желание использовать одинаковый синтаксис в трех одинаковых операциях.

Конечно я понимаю что Go это не PHP :)

Спасибо

вторник, 21 января 2014 г., 23:23:13 UTC+2 пользователь Orlovsky Alexander написал:

Anton Ageev

unread,
Jan 21, 2014, 5:19:34 PM1/21/14
to gola...@googlegroups.com
Можно писать как-то так: http://play.golang.org/p/YRJTVoolB6
Но это, имхо, ненужное усложнение кода.


2014/1/22 Павел Поляков <ka-z...@yandex.ru>

--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес golang-ru+...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.



--
WBR, Anton

Alexey Palazhchenko

unread,
Jan 22, 2014, 2:04:00 AM1/22/14
to gola...@googlegroups.com
Привет,


results := make(map[string]string)

// просто объявляем переменные
var r *regexp.Regexp
var captures []string

r = regexp.MustCompile("paid_y_12=(?P<match>[0-9])<br>") // используйте MustCompile
captures = r.FindStringSubmatch(text)
results["paid_y_12"] = captures[1]

r = regexp.MustCompile("paid_n_12=(?P<match>[0-9])<br>")
captures = r.FindStringSubmatch(text)
results["paid_n_12"] = captures[1]

И ещё: код тут идиентичный для примера или так и есть? Возможно, его стоит вынести в функцию?

–-–
Алексей "AlekSi" Палажченко

Igor Yurchenko

unread,
Jan 22, 2014, 4:26:35 AM1/22/14
to gola...@googlegroups.com
Алексей +1.

Ребята, не ленитесь явно объявлять переменные и минимизируйте использование оператора ':='. Это благотворно скажется на вашем здоровье...   
Если вы используете := при получении результата вызова функции то, чтобы узнать тип возвращенного значения, вам придется лезть в документацию
и смотреть объявление функции. Это лишние затраты как вашего времени, так и того, кто будет разбираться с вашим кодом после вас. 
Особенно это становится проблемой на больших проектах...

Используйте ':=' только для явной инициализации/объявления, как это сделано в для переменной result в коде ТС.


среда, 22 января 2014 г., 4:12:52 UTC+8 пользователь Павел Поляков написал:

itcraft...@gmail.com

unread,
Jan 22, 2014, 7:15:11 AM1/22/14
to gola...@googlegroups.com
Необходимо просто понять что := это всего лишь синтаксический сахар
и чётко понимать что он выполняет два действия:
- создаёт переменную
- присваивает ей значение выражения

Denis Portnov

unread,
Jan 22, 2014, 10:06:32 AM1/22/14
to gola...@googlegroups.com
в основе PHP то, что процесс умирает после каждого запроса и очищает память и закрывает все открытые ресурсы
в Go всегда надо думать о памяти, GC и конкурентном доступе к данным, так как программа (например сервер) может работать годами
исходя из этого например в вашем случае нет смысла убивать r, этот regexp пожет понадобится при повторных обращениях
промежуточные вещи типа captures лучше создавать внутри функции, тогда после выхода из функции они доступны для сбора GC и не надо ничего удалять руками

и для простых вещей когда известен вид строки нет смысла использовать regexp (что и для PHP актуально)

я делаю обычно так http://play.golang.org/p/HmyiIDQQCq
простейший парсет на основе поиска строки

Павел Поляков

unread,
Jan 22, 2014, 4:10:38 PM1/22/14
to gola...@googlegroups.com
2Denis Portnov
Спасибо, интересно

среда, 22 января 2014 г., 17:06:32 UTC+2 пользователь Denis Portnov написал:

Orlovsky Alexander

unread,
Jan 23, 2014, 5:08:50 PM1/23/14
to gola...@googlegroups.com
среда, 22 января 2014 г., 13:26:35 UTC+4 пользователь Igor Yurchenko написал:
Алексей +1.

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

Может это проблема используемого инструментария? IDE/Редактора?
Авторы Go не зря же включили подобную конструкцию в язык, а для того чтобы облегчить жизнь разработчику. Учитывая пуризм авторов языка надо понимать, что это большой подарок и не надо от него отказываться :)

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

А какие размеры (в строках кода) Go проектов, про которые вы говорите, что они "большие"? Где над такими сейчас работают в России?

 

Используйте ':=' только для явной инициализации/объявления, как это сделано в для переменной result в коде ТС.

В Go ничто не мешает написать автоматическую тулзу*, которая развернет все присвоения вида name := call() 
в 
var  name Type
name = call()

заодно магия** оператора := раскроется в скучный регулярный код


* может быть она даже есть?


**
Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block with the same type, and at least one of the non-blank variables is new. As a consequence, redeclaration can only appear in a multi-variable short declaration. Redeclaration does not introduce a new variable; it just assigns a new value to the original.

Igor Yurchenko

unread,
Jan 24, 2014, 5:38:22 AM1/24/14
to gola...@googlegroups.com


пятница, 24 января 2014 г., 6:08:50 UTC+8 пользователь Orlovsky Alexander написал:
среда, 22 января 2014 г., 13:26:35 UTC+4 пользователь Igor Yurchenko написал:
Алексей +1.

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

Может это проблема используемого инструментария? IDE/Редактора?

Извините, не хочу вас обидеть, но это отличный аргумент для оправдания кривых рук. "Это, мол, не я г№%нокодер а у вас инструментарий кривой... "
Чем именно вам должен помочь инструментарий/IDE/Редактор?
 
Авторы Go не зря же включили подобную конструкцию в язык, а для того чтобы облегчить жизнь разработчику. Учитывая пуризм авторов языка надо понимать, что это большой подарок и не надо от него отказываться :)
 
 Эта конструкция сделана для того, чтобы не повторяться при объявлении с инициализацией. типа:

    var v []int = make([]int, 100)

Объявление типа часто занимает куда больше 5 символов. Но за всё приходится платить. Внедрение оператора := повлекло с собой необходимость реализовать некрасивый костыль, о котором вы пишите в конце, редекларацию переменных.

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

А какие размеры (в строках кода) Go проектов, про которые вы говорите, что они "большие"? Где над такими сейчас работают в России?

Я имел ввиду большие проекты вообще. Не обязательно на Go. К этому же относится рекомендации в проектах на С/С++ объявлять переменные как можно ближе к тому месту где вы их собираетесь использовать. Для того, чтобы потом не пришлось прыгать по всему коду в поисках объявлений...
   
 

Используйте ':=' только для явной инициализации/объявления, как это сделано в для переменной result в коде ТС.

В Go ничто не мешает написать автоматическую тулзу*, которая развернет все присвоения вида name := call() 
в 
var  name Type
name = call()

заодно магия** оператора := раскроется в скучный регулярный код

 
Э-э... Вы напишите?
Есть люди, которые за собой убирают. А есть такие, после которых всегда остается свинарник и они убеждены, что кто-то должен прийти и всё убрать за ними...
Это вещи того же порядка. Либо придерживаться определенной самодисциплины и писать аккуратный хорошо читаемый код, либо...

Ваша аргументация исходит из каких-то ваших сиюминутных удобств в надежде на то, что вам потом не придется иметь дело с тем, что вы написали...
 
Reply all
Reply to author
Forward
0 new messages