Nikita
ох писец
Oleg
Объявляение просто вводит новое пустое значение
Oleg
А, пардон
Oleg
Ты исправил :)
Nikita
а
Nikita
ты про это
Nikita
а разница есть?
Kirill
nil это вам не nil
Но если var nil = 1...
Oleksii
Но если var nil = 1...
А так можно?)
Oleksii
Это же извращение какое-то получается :)
Vladimir
https://play.golang.org/p/STVXHOr1ml
Vladimir
типа как раньше, закопал в середине stdio.h что-то типа #define true false и уволился.
Oleg
T - значение структуры, в чистом виде. Прям так и переносится из переменной в переменную копируясь. *T - указатель. Где-то там в памяти лежит значение и мы переносим только адрес его. Соответственно T{} создает значение. А &T{} - указатель.
Vladimir
а лучше ядро пересобрал перед этим
Kirill
Но не нужно
Oleksii
Да
Мдее
Vladimir
А так можно?)
https://play.golang.org/p/STVXHOr1ml
Vladimir
нажми там на кнопачку "Run"
Vladimir
Ну или тут: https://play.golang.org/p/ZO9HY17orK
Oleksii
Я уже увидел, поэтому так отреагировал
Oleg
если я сделаю a := &T{"hi"}, а потом b := &T{"nope"}, a и b будут разными?
Да :) Тип у обоих будет *T. Но указывать будут на разные значения.
Илья
а можешь сделать *a = *b
Vladimir
Я уже увидел, поэтому так отреагировал
Это собсно везде так: [none-none][20:59:32] vlazarenko@alluminium (~/go/src/blip)$ cc -o a a.c a.c:3:9: warning: 'NULL' macro redefined [-Wmacro-redefined] #define NULL "xren vam i tut sobsno" ^ /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/_types/_null.h:29:9: note: previous definition is here #define NULL __DARWIN_NULL ^ 1 warning generated. [none-none][20:59:34] vlazarenko@alluminium (~/go/src/blip)$ ./a xren vam i tut sobsno[none-none][20:59:50] vlazarenko@alluminium (~/go/src/blip)$ [none-none][20:59:53] vlazarenko@alluminium (~/go/src/blip)$ cat a.c #include <stdio.h> #define NULL "xren vam i tut sobsno" int main(void) { printf("%s", NULL); return 0; }
Oleksii
Тут был бы лучше вопрос будут ли разными a := &T{"a"} и b := &T{"a"} :)
Nikita
странно, получается я делаю почти одно и тоже, только если не сделать & (как это называется?), то я буду знать где находится оригинал, а если сделать, то не буду знать где находится оригинал
Oleksii
Многое станет яснее
Vladimir
указатели это жопа, для тех, кто никогда не писал на C или C++
Oleksii
& - берешь адрес ячейки памяти
Vladimir
но разобравшись с ними, все становится намного понятнее и проще
Nikita
Oleksii
* - получаешь значение с ячейки памяти
Oleg
странно, получается я делаю почти одно и тоже, только если не сделать & (как это называется?), то я буду знать где находится оригинал, а если сделать, то не буду знать где находится оригинал
Разница вот где проявляется: a := T{"hi"} b := a b.S = "nope" println(a.S) Выведет "hi", потому что T скопировалось из a в b. a := &T{"hi"} b := a b.S = "nope" println(a.S) Выведет "nope", потому что T осталось в памяти одно. Скопировался только адрес.
Nikita
во 2 варианте, я уже работаю только ссылкой, а не с значением получается
Oleg
Угу
Nikita
a := T{"hi"} b := &a
Nikita
но разве я так не могу делать?
Vladimir
при присваивании указателя всегда будет меняться нижележащее значение
Vladimir
при присваивании без указателя, в памяти будет копия данных
Oleg
Можешь. Тогда b.S изменит и a.S. Потому что b указывает на a.
Vladimir
b не имеет ничего в себе, кроме указателя на a (адреса в памяти)
Slava
Vladimir
это полезно когда, например, каким-то методом надо поменять значения, но при этом гонять копию данных по памяти туда сюда смысла нет.
Nikita
a := T{"hi"} & a := &T{"hi"} разница в подходах только получается? Я либо выбираю работать все время со значением и если что вручную скопирую ссылку, или постоянно работаю только с ссылкой
Oleg
В общем-то да.
Vladimir
если ты a никуда не будешь присваивать, то монопенисуально
Vladimir
а если будешь, то тогда уже нет
Oleksii
Ответ есть, как ни странно, в спецификации языка
Я понимаю, что случится. Это я к разговору.
Vladimir
a := T{"hi"} b = a в b копия a
Vladimir
а := &T{"hi"} b = a в b копия а тоже, но в 10 раз меньше, ибо только адрес
Nikita
Только надо говорить не "скопирую ссылку", а "возьму адрес на"
этого из js нахватался, там есть понятие ссылок, но про адреса не говорят
Vladimir
дальше в первом случае b.S = bla // a.S остается "hi"
Nikita
хотя по логике вещи одни и те же
Vladimir
во втором: b.S = bla // a.S становится тоже bla
Vladimir
Интересно, почему именно 10?)
потому что мне лень считать и спрашивать разрядность его процессора 🙂
Vladimir
в <подставьте правильное число, пожалуйста> раз 🙂
Nikita
Там их и нет, как конструкции языка :)
но нужно понимать ,что примиты всегда копируются, а массивы и объекты только ссылки(адреса)
Slava
Это неправда
Nikita
я про js
Nikita
говорю
Oleksii
Oleksii
Но я в нём не эксперт, так что ни за что не ручаюсь :)
Nikita
просто &T{"hi!"} вводит вступор, потому, что я вроде бы обращаюсь к указателю через операнд, а оказывается я получаю новую копию с ссылкой
Oleksii
Ты берешь адрес только что созданной структуры
Oleksii
Через литерал
Vladimir
Ты инициализируешь структуру, присваиваешь значение мемберу и получаешь ссылку на результат
Vladimir
чего ступорного-то?
Nikita
аааа
Oleg
& - не операнд, а оператор :)
Nikita
я смотрел на это не на как литерал, а как на еще одну функцию
Vladimir
а. нене. литерал 🙂
Nikita
&(оператор)T{}(операнд) вот так я считал
Nikita
блин, теперь я понял, что не так, я не привык, что могу создавать литералы