> It doesn’t look natural for me to have to pad the slice with the default 
values of the type, as they will be overwritten by the copy anyway.

This is exactly what `append` is for. If you're overwriting existing 
entries (those between 0 and length), use `copy`. If you want to write new 
entries (between length and capacity), use `append`.

On Wednesday, May 28, 2025 at 4:12:39 PM UTC-7 Keith Randall wrote:

> Think of `copy` as a safe `memmove`. There's nothing more to it. It does 
> not modify the length or capacity of anything. (And it can't. `copy(a,b)` 
> cannot modify either the length or capacity of `a` or `b`. Slices, and 
> particularly the slice's length and capacity, are passed by value.)
> ```
> func f(a []int) {
>     a = a[1:2:3] // set a's length to 1, capacity to 2
> }
> a := make([]int, 5, 10)
> f(a)
> // a's length is 5 and capacity is 10 here.
> // f only modified its local variable. It did not modify its caller's 
> local variable.
> ```
>
> This is why the results of `append` need to be assigned somewhere. The 
> complete statement `append(a, 9)` writes 9 to a[len(a)], but doesn't (and 
> can't) modify a. You have to use the statement `a = append(a, 9)` to get 
> a's length updated.
> On Wednesday, May 28, 2025 at 2:16:54 PM UTC-7 Jason E. Aten wrote:
>
>> Hi Сергей 
>>
>> It sounds like you are coming from a C/low level optimization point of 
>> view. Which
>> is great. But there are things about Go that might you surprise you then. 
>> For example,
>> the backing array for the slice is always fully zero-value initialized 
>> anyway. So changing
>> its length within its capacity doesn't do any _extra_ zero-ing, like you 
>> suggest. It was already done.
>>
>> This question might also be learning-path dependent. When I learned Go, 
>> and still to this
>> day, I rarely if ever think about capacity, just the length. 
>>
>> I just allocate the length I want/need, and go from there. From that 
>> point of view, 
>> copy makes perfect sense. Really cap is an optimization for when you're 
>> mostly done and want to squeeze out the last 1% by staring at the 
>> profiler for a day. 
>>
>> I suggest that you can, and perhaps should, just ignore cap
>> when you are learning how Go works or is typically used.
>>
>> The only time I even think about capacity is when I'm passing a temporary 
>> workspace slice to 
>> a serialization or encryption function. This is a common pattern in the 
>> crypto libraries.
>>
>> You have a big re-usable slice, but you set its length to zero when 
>> passing it
>> to the encryptor/serializer subroutine, leaving its capacity large. In 
>> turn, the subroutine can
>> re-use that memory, communicating back how much it used by returning a 
>> slice pointing
>> to the same backing array.  Since encryption is typically 1-1 your 
>> program can be 
>> made to do additional allocation after the setup.
>>
>> Conversely, if the provided buffer was not big enough, the subroutine 
>> must allocate, 
>> and it will return the bigger workspace, which can still be re-used
>> next time. BUT, the subroutine doesn't even really have to do anything to 
>> make this happen. Nice! What?
>> How can that be?
>>
>> How this works: the subroutine just takes a slice as an input argument, 
>> appends blindly, and returns the slice in a return value.
>> The slice will automagically get reallocated --but only if there wasn't 
>> enough space to handle all the appending.
>>
>> Hope this helps. You don't really have to think about cap until later in 
>> your journey, and it will
>> all work just fine.
>>
>> Best wishes.
>> Jason
>>
>> On Wednesday, May 28, 2025 at 5:41:58 PM UTC+1 Сергей Пилипенко wrote:
>>
>>> Hello, gophers!
>>>  
>>> I have attempted to use the copy function for slices and found it’s API 
>>> a bit strange. Suppose I have two slices: one of size 0 and capacity 10, 
>>> the other of size 10 and capacity 10. When I copy the second one into the 
>>> first one nothing happens, because the length of the first size is 0, 
>>> although it could hold the elements just fine.
>>>  
>>> So, I am wondering why isn’t copying limited by the capacity of the 
>>> destination slice instead? It doesn’t look natural for me to have to pad 
>>> the slice with the default values of the type, as they will be overwritten 
>>> by the copy anyway.
>>>  
>>> Thank you for the time! 
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/138935d9-ad7c-4cbd-8749-6da07382b37bn%40googlegroups.com.

Reply via email to