LINUX.ORG.RU

чего Донован так делает, разве это правильно?

 


0

2

Начал читать книгу «Язык программирования Go» Донован/Керниган и буквально на первом примере у меня начинаются проблемы с Донованом, т.к. Кернигана там только для названия взяли.

// Echo1 prints its command-line arguments.

package main

import (
	"fmt"
	"os"
)

func main() {
	var s, sep string
	for i := 1; i < len(os.Args); i++ {
		s += sep + os.Args[i]
		sep = " "
	}
	fmt.Println(s)
}

Ясно, что s и sep начинают существовать при инициализации с пустым значением (""), но почему он начинает использовать sep до присвоения ему значения пробела? Красоты ради, чтобы короткая строка была ниже длинной или что? Чего использовать переменную до присвоения ей рабочего значения? Это допустимо, но разве это правильно?


Видимо, чтобы разделить слова пробелами, но чтобы первое слово не начиналось с пробела.

Как учебный пример, наверное, сгодится, но для работы есть strings.Join.

proud_anon ★★★★★
()

Использование не инициализированных переменных даже поощряется, что данный пример и иллюстрирует.

Make the zero value useful. ©

beastie ★★★★★
()
Ответ на: комментарий от slon

А вообще это не по канонам, возникает итерационная зависимость, и как следствие худшее понимание. Если уж цикл по индексу, то лучше s += (i ? sep : "") + ..., т.е. явное условие. sep инициализировать в объявлении, соответственно, и больше не трогать.

arturpub ★★
()
Ответ на: комментарий от arturpub

В обоих случаях не очень красиво. Тут правильно без этих финтов ушами просто склеить все пробелами, а затем обрезать.

filequest
()
Ответ на: комментарий от filequest

Тогда при обрезке if (len()) из цикла вылезет.

Чтобы было совсем красиво, такие вещи надо прятать под грамотный sjoin(arr, sep=" ") с двупроходным выделением-заполнением, и вообще не индексоепствовать в клиентском коде.

arturpub ★★
()

Ну ты же используешь неправильное местоимение, и ничего, небо не обрушилось на землю

buddhist ★★★★★
()
Ответ на: комментарий от Deleted

В данном случае это не имеет значения, а насчет инициализации я отметил в вопросе. Здесь первое использование нужно именно без пробела, а последующие с, чтобы выхлоп не был с первым символом пробела.

slon
() автор топика
Ответ на: комментарий от filequest

просто склеить все пробелами, а затем обрезать.

Вырезание пробела из начала — это ещё один проход всей строки, нафиг надо?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

На фоне квадратичной конкатенации с реаллоками «нафиг надо» превращается в «уже пофиг», так что не страшно. Тут речь больше о структуре кода, чем исполнения.

arturpub ★★
()
Ответ на: комментарий от arturpub

Пустое обсуждение. Пример для начинающих, вроде хелловорда, тут речь не об эффективности, работает верно. Эффективность это даже не через join, это через bytes.Buffer.WriteString но это уже не совсем для начинающих.

anonymous
()
Ответ на: комментарий от arturpub

квадратичной

Пруф? Если он каждый раз при достижении длины выделенного буфера выделяет в два раза больше, то это O(NlogN).

anonymous
()
Ответ на: комментарий от anonymous

Вполне возможно. В любом случае, нет ничего зазорного в примере.

anonymous
()
Ответ на: комментарий от Gvidon

Да, вот что реально надо — так это выжигать напалмом из мозгов мысли о двойных проходах, а если не получается — поручать метлу. может тогда с мертвой точки в этой_индустрии что-нибудь сдвинется.

filequest
()
Ответ на: комментарий от filequest

Жс с домом тащемта уже 20 лет как существуют и используются десятками тысяч сотен макак, без всяких двойных проходов. И чо, бл? Добро пожаловать в мир будуще тормозного вебдванутого говна everywhere. У меня на компе любая гта идет плавнее, чем убогонькие выхлопы этой_индустрии.

Когда напишешь что-нибудь дельное полностью таким подходом, внезапно осознаешь, что даже на топовом i7-100500МГц/4096Гб можно осязаемо впираться в асимптотику или циклы сборки, и ничего специального для этого готовить не надо.

arturpub ★★
()
Ответ на: комментарий от anonymous

Но едва ли это так, т.к. строки в Go иммутабельные.

Softwayer ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.