Илья
обычно, тут всплывает пример с append, где игнорируется реаллокация
Valentin
Вообще да, слайсы передаются по ссылке
Anonymous
щас проверю append
Valentin
Честно говоря ни разу не встречался
Anonymous
https://play.golang.org/p/hsyjmQLdsP
Anonymous
блэт, перестало по ссылке передаваться
Vladimir
Ответы на такие вопросы приходят проще если понимать что происходит
Vladimir
И что такое слайс
Илья
https://golang.org/pkg/reflect/#SliceHeader
Anton
какая аргументация насчет возврата func getAll() []Test заместо func getAll() *[]Test ?
Илья
https://play.golang.org/p/RlBUNtxlXH
Илья
у меня скорее вопрос, какая аргументация за *[]Test, если []Test норм?
Anonymous
Vladimir
https://golang.org/src/runtime/slice.go
Vladimir
11 строка
Vladimir
Vladimir
Например аппенд, а не изменение элемента будет делать на слайс не то что ты ожидаешь, передав его по ссылке
Vladimir
А дальше вопрос - ты будешь возвращать новый слайс или просто менять старый
Vladimir
Илья
Теперь я ещё больше удивлён.
почему? ты получаешь копию структуры с указателем на общие данные, когда ты присваешь ему nil, ты сбрасываешь свой указатель, но это не аффектит исходные данные, но, если ты изменяешь данные, то операцию происходят над теми же данными
Vladimir
Аргумент же
Anonymous
func TestSomeTest(t *testing.T) {
s := []int{1,2,3}
func(d []int){
d = append(d, 4)
}(s)
log.Println(s)
}
результат 1,2,3
если б "по ссылке", то 1,2,3,4
Илья
func TestSomeTest(t *testing.T) {
s := []int{1,2,3}
func(d []int){
d = append(d, 4)
}(s)
log.Println(s)
}
результат 1,2,3
если б "по ссылке", то 1,2,3,4
append, в данном случае аллоцирует новый slice
Vladimir
Vladimir
Замени на make([]int, 0, 10)
Vladimir
В том же коде
Vladimir
Будет тот же результат
Valentin
Anonymous
func TestSomeTest(t *testing.T) {
s := make([]int, 10)
s[0] = 1
s[1] = 2
s[2] = 3
func(d []int){
d = append(d, 4)
}(s)
log.Println(s)
}
[1 2 3 0 0 0 0 0 0 0]
Мерль
Илья
Vladimir
Valentin
Блин я уже забыл про эти особенности
Anonymous
Oleg
Так не изменится же ничего. Как выводило 1, 2, 3, так и будет выводить
Valentin
Действительно, если cap хватает аллокации не будет
Vladimir
Mikalai
Илья
или все данные добавлять append
Anonymous
Anonymous
в логе
Valentin
Покажи код
Anonymous
что так:
func TestSomeTest(t *testing.T) {
s := make([]int,3, 10)
s[0] = 1
s[1] = 2
s[2] = 3
func(d []int){
d = append(d, 4)
}(s)
log.Println(s)
}
Vladimir
Anonymous
что так:
func TestSomeTest(t *testing.T) {
s := make([]int, 0, 10)
s = append(s, 1)
s = append(s, 2)
s = append(s, 3)
func(d []int){
d = append(d, 4)
}(s)
log.Println(s)
}
Anonymous
Что и есть ожидаемо :)
как же? ведь без реаллокации мы должны были поменять исходный слайс, как я понял и получить 1 2 3 4
Vladimir
Anonymous
парни, если я в функции main запускаю поток(go parser()), то каким образом сделать так, чтобы программа не отстанавливалась пока выполняется поток?
Vladimir
При передаче его в функцию
Vladimir
Происходит копирование структуры слайса
Vladimir
Указателя на функцию
Vladimir
Капа и лен
Vladimir
Ты меняешь Len нового слайса
Vladimir
Но при этом первые три элемента ты можешь менять
Vladimir
И если ты залезешь внутрь старого слайса и поменяешь ему только Len на 4, то там тоже найдешь свой новый элемент
Oleg
Илья
Vladimir
Илья
Valentin
Смысл спорить, обратимся у официальному источнику https://blog.golang.org/go-slices-usage-and-internals
Максим
Oleg
Vladimir
Valentin
А не лучше вернуть слайс в return?
Anonymous
ну или так
Anton
короче, мапы можно передавать без *, если я туда в функции хочу напихать еще мульён значений ?
Valentin
Valentin
Верни в функции слайс и все
Anonymous
у меня есть код, который римерно 32млн значений пихает в мапу и читает из нее на протяжении разлиичных вызовов в скрипте