alowave#~
Целое число
Darwin
я что-то тоже не понял
Artem
дай линк на спеку
Darwin
что изменить то нельзя, тип?
Roman
??? var a := []int{1,2,3} a[0] = 5 fmt.Println(a)
вот пример, когда можно изменить объект внутри слайса: a := []*T{&T{}, &T{}, &T{}} t := a[0] t.Mutate() t.Field = "newval"
Roman
а integer это же у нас примитива, её невозможно изменить, её можно только перезаписать другим значением
Roman
а в чем разница?
в том что ты мутируешь, слайс или объект внутри слайса
Artem
ничего нельзя изменить, можно только перезаписать
Roman
вот пример, когда можно изменить объект внутри слайса: a := []*T{&T{}, &T{}, &T{}} t := a[0] t.Mutate() t.Field = "newval"
@vetcher в примере выше мы не перезаписали значение в слайсе, там по прежнему тот-же указатель, но данные под указателем мы мутировали
Roman
слайс остался тем-же, а вот объект под ним - мутировал, с примитивами такое, AFAIK, невозможно
Artem
@vetcher в примере выше мы не перезаписали значение в слайсе, там по прежнему тот-же указатель, но данные под указателем мы мутировали
скажи, когда для тебя перезаписывание превращается в мутацию? потому что в машине ток единички и нолики, которые ты можешь или перезаписать или прочитать
Artem
но я думаю изначальный ответ на твой вопрос - нет
Nik
const BigNumber = 1 << 100 // 1 with one hundred zeros var BigNumberAsFloat float32 = BigNumber fmt.Println(BigNumberAsFloat) // 1.2676506e+30
Nik
а это что за дичь получается?
Nik
вначале готура
Nik
пример
Nik
https://go-tour-ru-ru.appspot.com/basics/16
Nik
и немного не понял. Можно объявлять сколь угодно большие константы, даже если не существует типа который их вместит? Какой тогда тип у этой константы?
Nik
ну т.е. допустим что выражение 1 « 100 возвращает некое число, которое в целых числах является единицей со ста нулями 1) Почему это выражение нельзя сохранить, но можно вычислить, даже если нет никакого типа куда его можно было бы сохранить? И какой тип у него? Попытка узнать printf("%T") провалилась 2) Почему это можно сохранить в флоат? 3) Как при приведению к флоату получается это число?) Я туплю канешн, но непонятно как-то
Roman
скажи, когда для тебя перезаписывание превращается в мутацию? потому что в машине ток единички и нолики, которые ты можешь или перезаписать или прочитать
указатель может не измениться, а данные под ним могут измениться = mutation. В данном случае мутированная память идентифицируется адресом. перезапись значения переменной = mutation. В данном случае память идентификацируется именем в stack'е (что в конце концов тоже адрес, I know, но с точки зрения написания это именованный stack entity).
Zver
а это что за дичь получается?
Потому что константа приводится к конкретному (на этапе компиляции) типу когда присваивается переменной. Она до этого момента без всякого типа.
Artem
ааа, вот о чем ты
Zver
Все обычно.
Zver
Но с мапой такое не работет.
Anonymous
О сколько нам открытий чудных ... :))
Anonymous
Но с мапой такое не работет.
но да, с мапой такой финт работать не будет
Roman
А что тут такого?
а то что const [] int это, в таком случае, опасно и нужно выписать const [] const int func main() { a := []int{1, 2, 3} fmt.Println("before: ", a) i := &a[0] // i will become a: "* const int" *i = 4 // Compile-time error, cannot assign to immutable type fmt.Println("after: ", a) // Should be: [1, 2, 3] }
Roman
коллега, это безумие
увы, transitive immutability это тоже не вариант
Daniel
const []int должно означать, что ты не можешь изменить ни слайс, ни значения в нем
Roman
И будет 150 const.
no, why? не нужна иммутабельность - не пользуйтесь 🙂
Roman
const []int должно означать, что ты не можешь изменить ни слайс, ни значения в нем
а const [] [] *T тогда означает что мы не сможем мутировать T в иммутабельной матрице. Это недостаточно выразительно, поскольку изначально у нас в уме было const [] const [] const *T ДА, я знаю что это doхуа verbose, но если мы пойдём путём сквозной иммутабельности то в сложных ситуациях люди буду просто избегать иммутабельные типы поскольку они не позволят им выразить свои намерения. Они преврять немутабельную матрицу в мутабельную и это делает вообще всё концепцию иммут типов абсолютно бесполезной, читайте тут
Roman
@onokonem уж лучше тогда иммут по умолчанию в Go 2.x, потому-что mut во-первых короче 😃 а во-вторых намного реже будет встречается чем const читайте здесь
Anonymous
нафиг-нафиг
Nik
1 << 100 это битовый сдвиг, а не число со ста нулями :D
затупил. Эквивалентно умножению на 2 в степении 100 же
Nik
Т.е. константа этот кусок нетипизированной памяти?
Zver
Т.е. константа этот кусок нетипизированной памяти?
Константа это фактически строка. Которая привидится к типу в процессе компиляции в месте применения.
Daniel
а?!
Daniel
какая строка?
Nik
1«100 возвращает строку? О_о
Zver
какая строка?
Образно выражаясь.
Roman
а вот и нет. люди будут избегать конструкций, про которые они не твердо понимают, что они делают. и то, что ты придумал - оно сложное, никто вникать не будет, все забьют. а то, что я думаю - оно простое. написал const - все, привет, мутировать не дадут
обычным смертным иммутабельность будет не нужна, они будут продолжать писать всё в мутабельном стиле, им пофиг)) а вот авторам библиотек, API, проектировщикам сложных систем этих людей нужно будет ограничивать ради избежания багов. мне пока никто вразумительно не пояснил, как мы решим проблему transitive immutability которую я описал
Daniel
коллега хотел сказать "литерал", видимо. а про типизованные константы просто забыл.
Nik
Как у человека с плюсовым бекграундом, в моем понимании литерал имеет тип.
Roman
ну то есть надо будет тыщу раз писать конст?
в Go 1.x - да, но можете не беспокоиться, вероятность того что этот пропосал примут в Go 1.x довольно низка, к большому сожалению. В Go 2.x я предлагаю всё по умолчанию сделать немутабельным, тогда в коде вообще не будет const, но парочка mut тут или там
Nik
Как у человека с плюсовым бекграундом, в моем понимании литерал имеет тип.
Так что не понял про "образно строку". Можно еще попытки объяснить? Предположение о том что это кусок нетипизированной памяти - верно?
Roman
func ReadMatrix(m [][]*T) { m = [][]*T{} // Compile-time error m[0] = []*T{} // Compile-time error m[0][1] = &T{} // Compile-time error t := m[0][1] t.Mutate() // Compile-time error t.Field = "newval" // Compile-time error m1 := &m[0] append(*m1, []*T{}) // Compile-time error }
Roman
если же мы хотим таки иметь возможность изменять *T в матрице, тогда нам нужно оповестить об этом пользователя функции: `func ReadMatrix(m [][]* mut T)` func ReadMatrix(m [][]* mut T) { t := m[0][1] t.Mutate() // Fine! t.Field = "newval" // Fine! }
Anonymous
ИМХО, но это таки треш
Roman
ИМХО, но это таки треш
вы этого не поймёте пока не начнёте отвечать за большой проект, большую команду, опен сорсный пакет и т.д.
Artem
ну то есть вроде как иммутабельная матрица а вроде как и нет
Artem
жесть какая-то.
Aleksandr
если же мы хотим таки иметь возможность изменять *T в матрице, тогда нам нужно оповестить об этом пользователя функции: `func ReadMatrix(m [][]* mut T)` func ReadMatrix(m [][]* mut T) { t := m[0][1] t.Mutate() // Fine! t.Field = "newval" // Fine! }
я вчера кстати задавал вопрос про const в js, типа что с ним не так. Мне объяснили) но я сегодня вспомнил что имел в виду простоту использования. одна const и все. Насколько я понимаю, большинству не нравится сложность использования и понимания конструкций. нет?
Roman
а значение под указателем T* в примере выше тоже будет иммутабельным? Или только сам указатель?
*T = immut pointer to immut T * mut T = immut pointer to mut T mut * mut T = mut pointer to mut T mut * T = mut pointer to immut T mut -> type, слева направо
Artem
окей. а давайте все нахер сделаем иммутабельным и будем какой нить copy-on-write делать не? здесь не сработает?
Nik
Пояснили что константы в го инлайновые и вычисляются в момент подстановки.
остается понять почему это 1«100 влезает в флоат64 и не влезает в инт64 при том что у них одинаковый размер, и 1»100. Особенности представления чисел с плавающей точкой ?
Aleksandr
Artem
а если я хочу типа матрицу то mut [] mut [] mut * mut T ?