Oleksii
Есть и хорошие, но их меньше
Nikita
ну я не спорю, когда я начинал с js, я часто бился об копировании ссылок при работе с объектами и массивами
Vladimir
Есть и хорошие, но их меньше
кстати по поводу C++ очень рекомендую книжку Andrew Koenig & Barbara E. Moo - Accelerated C++
Vladimir
Редактор в той серии дядя Бьярн, и там реально очень хорошо расписаны некоторые оооочень скользкие моменты языка
Oleksii
кстати по поводу C++ очень рекомендую книжку Andrew Koenig & Barbara E. Moo - Accelerated C++
Да мне уже не надо, я тогда хорошо его выучил, потом была Java, на ней я сейчас зарабатываю, ну а совсем скоро будет Go :)
Vladimir
Да мне уже не надо, я тогда хорошо его выучил, потом была Java, на ней я сейчас зарабатываю, ну а совсем скоро будет Go :)
за год? ух, ок 🙂 я на ++ лет 15 пишу уже и то, иногда заезжаю в дебри. Java по сравнению с плюсами просто walk in the park
Vladimir
равно как и Go 🙂
Oleksii
С другого скоупа, так сказать
Nikita
оо в го тоже есть type Stringer interface { String() string }
Vladimir
И в чем проблема? 🙂
Nikita
типо toString(), valueOf() как в js
Vladimir
нене
Vladimir
этом самому надо реализовывать
Nikita
ну да, в js тоже
Vladimir
а, я в js не силен
Nikita
ты можешь сделать объект и объявить в нем пару методов, toString() который вызывается каждый раз когда нужно конвернуть объект в строку и valueOf() когда нужно превратить в number
Nikita
у меня вопрос, я серьезно должен использовать пакет strconv, чтоб конвертировать цифры в строку?
Ivan
fmt.Sprintf("%d", numberValue) ?
Nikita
Сделайте так, чтобы тип IPAddr реализовывал fmt.Stringer, чтобы выводить адрес как четыре значения, разделенные точкой.
Ivan
так ведь %d.%d.%d.%d ?
Oleksii
func (ip IPAddr) String() { return "bla" }
Oleksii
но вместо blah - вернуть сегменты ip адреса
Anonymous
имеет смысл использовать syncmap?
Nikita
func (ip *IPAddr) String() string { return fmt.Sprintf("%d.%d.%d.%d", ip...) }
Slava
если нужно писать/читать в map из разных горутин - то да
Anonymous
для большой мапы где много чтения, немного меньше вставки и довольно редко удаление. с мьютексом из горутин
Kirill
Важный
Kirill
если нужно писать/читать в map из разных горутин - то да
, если тебе можно читать старые данные время от времени
Nikita
так ведь %d.%d.%d.%d ?
не могу понять, почему я не могу сделать []int... в fmt.Sprintf()
Nikita
type IPAddr [4]byte func (ip *IPAddr) String() string { return fmt.Sprintf("%d.%d.%d.%d", ip...) }
Nikita
cannot use ip (type *IPAddr) as type []interface {} in argument to fmt.Sprintf
Michael
(*p)...
Michael
предполагаю
Michael
ip у тебя указателем явл-ся
Kirill
(*p)...
Не будет работать
Nikita
ну так это метод, а методу пофигу что принимать, ссылку или значение
Kirill
Она даёт тебе другой результат
Nikita
даже если я делаю значение, ошибка та же
Nikita
values := []interface{ip...} я и так не могу делать?
aadz
библиотечка net не кошерная что ли?
Kirill
fmt.Println*(ip.IP) B и все
Ты понял, что ты написал?
Nikita
func (ip *IPAddr) String() string { values := make([]interface{}, 0, 4) for _, val := range ip { values = append(values, val) } return fmt.Sprintf("%d.%d.%d.%d", values...) }
aadz
fmt.Sprintf("%d.%d.%d.%d"... В любьом случае не в тему. Если type IPAddr [4]byte, то это массив и нужно просто string.Join() использовать, чтобы это в строку собрать
aadz
А! Join() же масив строк требует
Nikita
а можете объяснить, почему если я делаю, по функцию по String() через указатель, то интерфейс Stringer не срабатывает?
aadz
А чем net-то плоха? ip := net.IPv4(127, 0, 0, 1) fmt.Println(ip, ip.String()) И все
aadz
этим и плоха? :)
Oleksii
Человек должен научится использовать язык, а не копаться в стдлиб с первых минут
Kirill
func (ip IPAddr) String() string { return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]) }
Oleksii
самый простой способ
aadz
Хоть бы назвали как-то по-другому. Понятно, что стандартная библиотека никому не интересна, но вобще-то IPAddr там - это не массив из четырех байт. Зачем путаться и людей путать?
Nikita
func (ip IPAddr) String() string { return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]) }
да я через цикл сделал, норм зашло, хотя до такого простого способа почему-то не додумался
aadz
да я через цикл сделал, норм зашло, хотя до такого простого способа почему-то не додумался
Главное - это язык изучить, как говорят. Библиотечку посмотреть - это ламерство
Nikita
мне бы еще понять почему с указателем не работает, а без работает.
Nikita
я нашел ответ, но не совсем его понимаю
Nikita
https://stackoverflow.com/questions/16976523/in-go-why-isnt-my-stringer-interface-method-getting-invoked-when-using-fmt-pr
Pawel
Главное - это язык изучить, как говорят. Библиотечку посмотреть - это ламерство
а и не надо особо ни чего изучать - можно сразу начинать использовать)) как это ни глупо и по детски звучит, но реально же через практику гошечка лучше учится
Pawel
хотя у неё есть не тривиальные идиомы тоже
Oleksii
https://stackoverflow.com/questions/16976523/in-go-why-isnt-my-stringer-interface-method-getting-invoked-when-using-fmt-pr
ну там вроде бы понятно обьяснили, что именно не понятно?
Nikita
аа
Nikita
когда 6 раз перечитал, я понял
Oleksii
Есть правило языка: Методы с value-ресивером могут вызываться как с value, так и с pointer Методы с pointer-ресивером могут вызываться только с-под pointer
Nikita
типо когда я использую это вручную, то компилятор сам преобразует правильно, а когда через интерфейс, то этого не происходит
Oleksii
Oleksii
И вообще, многое, что связано с пустыми интерфейсами надо делать явно