Oleksii
&(оператор)T{}(операнд) вот так я считал
Это синтаксис создания структуры альтернативный
Oleksii
Но ты это уже понял :)
Vladimir
если непривычно, пиши развернуто для начала
Vladimir
привыкнешь, будешь сокращать. никто ж не мешает 🙂
Nikita
?
Nikita
в смысле развернуто?
Nikita
type T struct { S string } объявил структуру и через литерал T{} создаю ее, нет?
Oleksii
Можешь ещё создавать через var, и потом каждое поле менять :)
Oleksii
Или именовать поля структуры
Vladimir
package main import ( "fmt" ) func main() { var bla struct { ble string } bla.ble = "blip" fmt.Printf("%v", bla) }
Oleksii
t := T{name: "name"}
Vladimir
это если совсем развернуто
Nikita
t := T{name: "name"}
меня не это вогнало в ступор
Nikita
в js, можно объявить доступим класс class MyClass {}
Oleksii
Или: var t T t.name = "name"
Nikita
но на самом деле это просто функция
Nikita
к которой я уже могу обращаться через MyClass переменную
Vladimir
в go вместо классов структуры 🙂
Nikita
хм, тогда вернусь еще раз вот к этой штуке. var t *T тут *T это указатель, так тут ничего не создается, то мне возвращается nil, но так как я указал, что тип у переменной может быть только T, то получается, что присваивать в нее могу только T ?
Vladimir
yep
Nikita
типизированный nil, как выше говорили
Nikita
ясно
Vladimir
ясно
https://play.golang.org/p/y6nYLYNSQA
Nikita
а как потом в t что-то назначить?
Nikita
t = T{"hello"}
Nikita
даже такое не работает
Oleg
t = &T{"hello"}
Oleg
Потому что нужен указатель
Nikita
ааа
Vladimir
Nikita
var t *T это означает что принимает указательни только такого типа
Vladimir
> var t *T тип t = указатель на переменную типа T
Vladimir
t = T{"hello"}
это попытается туда засунуть не указатель, а копию
Vladimir
из-за чего будет послан лесом
Nikita
и получается наоробот не могу сделать
Oleksii
Можешь
Nikita
блин, я могу даже указывать, что я ожидаю в переменную указатель или значение
Vladimir
наоборот как раз можешь 🙂
Slava
> var t *T тип t = указатель на переменную типа T
указатель на область памяти где хранится тип T
Nikita
func main() { var t T t = &T{"hello"} }
Nikita
tmp/sandbox530703231/main.go:23: cannot use T literal (type *T) as type T in assignment
Oleksii
Ну не так :)
Oleksii
tmp/sandbox530703231/main.go:23: cannot use T literal (type *T) as type T in assignment
Ты при объявлении переменной указываешь ее тип
Vladimir
https://play.golang.org/p/o3sfaQYFsK
Oleksii
В твоём случае - это T
Slava
a := &B{}; b := &a - это указатель на указатель
Oleksii
a := &B{}; b := &a - это указатель на указатель
Не видел пока что такого в Go, разве что в С и С++
Vladimir
как говорили мне на работе в 90х годах... *а - хорошо, **а - объясни, ***а - протрезвей, ****а - уволен нахрен
Nikita
Ты при объявлении переменной указываешь ее тип
не понял, я указал переменной тип T без * и передаю в переменную указатель типа T, он и ругнулся
Slava
ну грубо говоря указатель на слайс или map, это почти указатель на указатель
Oleksii
А не наоборот
Slava
А потом люди удивляются, что требуются программисты с образованием высшим =)
Slava
всё это проходят на первом курсе университета
Vladimir
@eddimensi а как насчет такого: https://play.golang.org/p/TQgfhUkHEe
Vladimir
😄
Nikita
так я про это и говорю, если я выставил переменной t T, значит я не могу ей присвоить ссылку &T{}, но могу присвоить значение и наоборот, нет?
Oleksii
не понял, я указал переменной тип T без * и передаю в переменную указатель типа T, он и ругнулся
var t T t = &T{"name"} // error t = T{"name"} // ok var p *T p = &T{"name"} // ok p = T{"name"} // error
Vladimir
посмотри и никогда так на практике не делай 🙂
Nikita
и получается наоробот не могу сделать
Nikita
Можешь
Nikita
я просто походу тебя не правильно понял @alexsadliak
Vladimir
или даже так: https://play.golang.org/p/6d1c1E1B5P
Nikita
Ну как бы да. Так система типов и работает :)
ну я типы впервые в жизни увидел
Vladimir
вот тебе и вся система типов 😉
Oleksii
Можешь
Можно вот так: t := T{"a"} p := &T{"b"} t = *p // ok
Oleksii
Я о таком говорил
Nikita
wtf?
Nikita
а
Nikita
понял
Nikita
или нет
Nikita
@eddimensi а как насчет такого: https://play.golang.org/p/TQgfhUkHEe
так как интерфейс без типовой, то в него че угодно можно записать?
Oleg
Можно взять указатель на значение. И можно взять значение по указателю. Так преобразовываются T и *T друг в друга.
Oleksii
Берешь значение по адресу, который хранится в указателе p и присваиваешь его в переменную t
Vladimir
потому что в t ты присваиваешь значение, находящееся по адресу p
Vladimir
так как интерфейс без типовой, то в него че угодно можно записать?
именно. и при этом он тип будет менять каждый раз как в него что-то присваивают