- 1
- 2
- 3
- 4
- 5
- 6
- 7
package main
func main() {
var str = "Hello World"
var length = len([]rune(str))
println("Length of the string is :", length)
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−2
package main
func main() {
var str = "Hello World"
var length = len([]rune(str))
println("Length of the string is :", length)
}
String Length in Golang
To get the length of a String in Go programming, convert the string to array of runes, and pass this array to len() function.
инь, как тебе го? Выучить советуешь?
У меня есть пара говнотулов на няшной, статически слинкованных. Думаю их на го переписать, а то хипстота в няшную не может. Стоит ли?
Крестотул у меня тоже е, но я его пок ане буду трогаць
Другая причина это коллекции, и еще деструкторы. Вручную ебаться не очень прикольно, но увы
Кодопойнты небось, всё не как у сапиенсов.
Ты тварь тупая, в политоту!
>попробуй
Я и твою программу починив
Это размер в байтах а не буквах рунах
ты совершенно прав
я тебе напиздел понимаешь НАПИЗДЮНЬКАЛ наебал тебя блять ты понимаешь я СОВРАЛ нахуй я сказал тебе неправду
Руна это просто кодпоинт в юникоде размером кажется что 32 бита же? тоесть количество памяти у массива рун может быть больше чем у строки утф8 (а у массива еще и размер же)
Но вообще Иню прав в том, что функцию len писали горбатые колоеды
https://unicode.scarfboy.com/?s=U%2B0401 (401 по программячи 1025)
А вообще Ё не нужно
Мы не беларусы
зы: а вот со всякими лигатурами наверное и верно отсосать можно
https://i.imgur.com/8hzdsuV.png
Это руна 1045 (е) плюс руна 776 (диатезис или как-то так)
https://www.compart.com/en/unicode/U+0308
,но руны тут не виноваты: по правилам уняк-кода это ДВА различных кодпоинта
да?
Вообще — юникод нужно обрабатывать функциями для юникода. Потому что есть вообще 3 метрики — code units, code points и знакоместа, которые я не помню как называются. Для нормальных людей интересно обычно последнее.
я ниибу правда есть ли тамс длина
> Ё и Ü — отдельные буквы а не Е/U с точечками.
Это зависит от языка КМК
В английском ты можешь написать "Cafe" вместо "Café", это не будет ошибкой.
В нидерландском "een" это неопределенный артикль, а "één" это один (число) и скорее всего путать их не нужно
В русском ёжик и ежик ничем не отличаются, а у беларусов нельзя вместо "вёскi" (деревни) написать "вескi" -- это так же будет ошибкой
ps: доречи, кириллическая i (укр и бел) и латинская i -- разные кодпоинты
> знакоместа, которые я не помню как называются. Для нормальных людей интересно обычно последнее.
то есть когда я говорю "в слове хуй три буквы" я говорю о знакоместах?
Да, я имел в виду русский и немецкий. В других языкам могут быть как отдельные элементы для изменения букв, так и отдельные буквы, и свои правила использования этого всего.
> то есть когда я говорю "в слове хуй три буквы" я говорю о знакоместах?
Ну тебе же насрать, что перед "х" вставлен LTR маркер, чтобы арабы правильно слово видели, а между буквами какой-нибудь Joiner, чтобы слово не пидорасилось переносом? Значит о знакоместах.
вот например немцы "ss" пишут как ẞ (а швеййарцы -- нет)
Это одна буква или две?
У голландцев есть звук "ij" (ай или эй в зависимости от региона) и для него в теории тоже есть отдельная буква но почти не используется
В далекой России порядок наводил.
Ни один комиссар от него не удрал
Дед к большевикам жалости не знал.
Дед мой был штурмфюрер ẞ,
Дед мой был штурмфюрер ẞ,
Дед мой был штурмфюрер ẞ,
Дед Штурмфюрер, Штурмфюрер ẞ.
А вот песня про дедушку есть
https://youtu.be/omfaIvqB7U0?t=25
Жиза: "Ελλάδα это Греция"
Программист: для блядь, ладно. Одна буква -- один кодпоинт размером 4 байта
Жиза: "Ё"
Программист: буду проституткой
можно тока за O(N)
как называлась та сишная либа которая всё это умела?
Подсчёт длины строки в пикселях становится нетривиальной задачей. Это не в ДОСе длину строки умножить на восемь...
Там строки просто нельзя индексировать, и всё.
То есть они даже не пытаются сделать вид, что существует понятие "пятая буква"
Хочешь индексировать -- ну конвертни в байты (если все символы семибитные) и ебаш массив и слайс
А если хочешь нырнуть в говно, то вот
https://crates.io/crates/unicode-segmentation
Iterators which split strings on Grapheme Cluster or Word boundaries.
Так что рустишкам сразу сказали, что деда мороза не существует.
Все остальные языки едят говно в этом вопросе и лгут пользователю, и между нами -- не далеко ушли от сишки с char[], разве что чар у них побольше
Удобно, что сразу графемы. Ничего не оторвёт при переносе.
А если всё-таки надо графему разбить на кодпоинты (например, я пишу рендер), то как это лучше сделать?
Тип char всё таки есть, и это примерно Unicode Scalar (назовём его "буква")
Он занимает 4 байта, но строка не состоит из чаров
Строка состоит из байт
Поскольку невозможно получить в общем случае символ за O(1), а индексация должна работать за O(1), то высосать чары из строки можно только через итератор
Это будет O(N), но от итератора ты другого и не ожидаешь
То есть это как в плюсах: вектор индексируется, а лист -- нет.
Строка поддерживает слайсинг кстати, но если ты попадешь в середину UTF-8 (строки там всегдла UTF-8) то получишь паник
Захватывает кложа что-то по значению или по ссылке? Ответ на этот вопрос должен быть очевиден любому программисту, потому вы без труда скажете, что выведет эта программа
Ответ будет через час
Знаешь ответ, или рассказать?
Захват кложей свободных переменных происходит по ссылке в данном случае.
Утверждается, что эвристика следующая
https://eli.thegreenplace.net/2019/go-internals-capturing-loop-variables-in-closures/
Поскольку i меняется, то её и хватают по ссылке, и все горутины сидят с одной переменной, которая быстро превращается в 100.
Првильно её скопировать, тогда её захватят по значению, и будет заебс
Еще более правильно наверное никогда не хватать ничего в кложах, и всегда явно передавать переменную так как там ты можешь управлять способом передачи
https://twitter.com/i/status/1575831527619203073
Во всех языках (даже в С++) this это указатель. А в Go это просто аргумент, который можно передать.. по значению
Это не значит, что он скопируется (если ты его не изеняешь -- то компилятор может сделать конст реф) но семантикка такая, что метод получает копию
Это очень смешно))))
А в Крестах планируется добавить возможность указывать this-аргумент. Ему можно быдет указывать разные const/volatile и прочую питушню, как обычному аргументу, а не после закрывающей скобки, как сейчас. А ещё его можно будет сделать не указателем, а ссылкой, чтобы разным указателефобал лучше спалось. А ещё его можно сделать значением, тогда при вызове метода он будет оперировать на копии объекта....
Так вот собccно говнари могут делать так
Причем передача по значению это еще такой способ сказать "хочу конст".
Казалось бы пидорство -- копировать говно заради чтобы случайно не поменять его, но на этот случай у гавнарей есть во-первых агрессивный инлайнинг
А во-вторых анализ убегателя достаточно жирную пиздень всё равно покладет в кучу, и будет работать с нею по ссылке
Можно радоваться, всего-то годик до С++23 осталось подождать: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html
Можно писать:
Бонус: скоро можно будет в коде писать
?
>assume
без него не скомпилируется?
Алсо, джендер в 2023 не дикретен
И вообще это социальный коснтрцукт
Потому что авторам этого пропозала надоело ебаться с функциями-членами и их ограничениями, и они захотели сделать свои новые функции — статичными с сахарком, чтобы их можно было вызывать через ".".
> без него не скомпилируется?
Скомпилируется. А если ты напимал одно, а окозалось что в реальности это выражение ложно — получишь UB.
В реальности это нужно для того, чтобы подсказывать кобелятору, как лучше оптимизировать. К примеру, у меня есть код, который реализует правильное деление с остатком, а не интеловскую хуйню. Как результат, там внутре условие, которое для отрицательных чисел делает хитрые манипуляции. Если я знаю, что какая-то функция использует этот код, и что значение будет всегда положительным, я могу написать [[assume( x > 0 )]] и кобелятор выкинет проверку на отрицательность и весь экстра код, оставив тупо один IDIV из всего кода.
А можно специальным ключом комплятора вставить проверку в рантайме для дебага чтобы там реально вылетала ошибка если вернется не то,что обещано?
можно assume превратить в assert в дебажной бсорке, шоп вместо UB иметь фаст фейл?
В скобки аргумент заключать (обычный хак для безопасности) нельзя, потому что это слегка меняет поведение assume. Переключателя в компиляторе не будет, потому что assume не вычисляет аргументы: [[assume(++i > 42)]] не изменит значение i, и вообще, компилято имеет право его игнорировать, или спользовать не всю информацию — на -O0 оно скорее всего просто будет отбрасываться, к примеру, или если ты напишешь какую-то слишком замутную хуйню, компилятор скажет "нипанимаю, насяльника" и проигнорирует всё.
Хотя, если assert сделан исключительно средствами языка, и не является чем-то специальным для компилятора, то [[assume]] может заставить копелятор выкинуть код ассерта.
В этом коде копулятор может выкинуть проверку на нуллптр и вызывать кукарек безусловно, потому что если бы указать был нулевой, то предположение позже было бы ложным, чего не может быть.
Поэтому при передаче нулевого указателя ассерт даже не сработает, потому что программу распидорасит при вызове метода по нулевому указателю.
https://govnokod.ru/25997#comment510096
* Кроме ГЦЦ. ГЦЦ не умеет в невычисляемые выражения в данном случае. Но в 99% похуй.
Например, можно сделать такую хуйню:
Разве в переменная-указатель может быть чем-то иным, кроме как целым числohm?
Например: [[assume(++it != end)]] — мы обрабатываем не последний элемент. Значение it не должно поменяться.
У шланга __builtin_assume(++it != end) работает именно так. У ГЦЦ if(++it != end); else __builtin_unreachable(); инкрементирует it.
assume(it == 44) и выкинуть весь код проврки нахуй?)
Начинаются какие-то тонки игры между выражениями, вычисляемыми компилятором в момент копуляции, и рантайм хуйней
К примеру
В этом коде компилятор уже считает, что i >= 0 и i < 4, потому что инче UB. Писать сюда [[assume(0 <= i && i < 4)]] бессмысленно — компилятор уже это предполагает и может делать любые трансформации с кодом. К примеру, он мог бы оперировать только над младшим байтом i, потому что в остальных всё равно должны быть нули.
Чтобы вместо УБ я видел более внятные ошибки пока их дебажу
Или жди контрактов:
Структуры в Расте по умолчанию не копируются, а муваются (трейт копирования нужно заказывать явно) потому что раст вообще стсрается всё мувать в отличие от плюсов
В купе с учением об оунершипе это может приводить к смешным баграм.
Этот код (совершенно нормальный в С++ например) не скомпилируется в расте
Иньо, почини эскейпинг!
МГИМО финишд?
Area что ли над0?
Он объяснял это болезнью, которую пережил ещё до своего 18-летия, что сделало его равнодушным к женскому полу. Но Тесла считал, что это даже к лучшему.
«Я сэкономил очень много времени и очень много энергии для научных исследований. Наука — вот моя первая, главная и единственная любовь. Другой мне не надо», — писал он в 80 лет.
Я не знаю, нужна ли реализации NFSа виртуальная память (или там всё невыгружаемо и в ядре) но скорее всего нужна, так что такая мандала даже не запустится.
Мне стало интересно, а бывают-ли такие додики IRL. Разумеется, любые додики бывают
https://social.technet.microsoft.com/Forums/lync/en-US/7424027c-fb9b-4202-a177-2a11581309d0/moving-pagefilesys-to-an-iscsi-device
(iscsi это такой SAN -- конкурент файберченнлов)