在Go中追加的返回值

在Go中追加的返回值,go,slice,Go,Slice,看完这篇文章后,我有一些疑问 基本上,为什么我们需要在Go中存储append的返回值?该功能实际上是如何实现的 如果我没有弄错的话,我已经尝试在C中复制append的机制,C是第一种用来实现Go语言的语言。我使用了malloc,而不是数组,因为它在函数返回后不会释放切片 这是我的密码: #include <stdio.h> #include <stdlib.h> typedef struct SliceHeader { int length; int c

看完这篇文章后,我有一些疑问

基本上,为什么我们需要在Go中存储append的返回值?该功能实际上是如何实现的

如果我没有弄错的话,我已经尝试在C中复制append的机制,C是第一种用来实现Go语言的语言。我使用了malloc,而不是数组,因为它在函数返回后不会释放切片

这是我的密码:

#include <stdio.h>
#include <stdlib.h>

typedef struct SliceHeader {
    int length;
    int capacity;
    int *zerothElement;
} SliceHeader;

void append(SliceHeader *sh, int element)
{
    if (sh->length == sh->capacity) {
        // grow capacity size
        sh->capacity += 10;
        realloc(sh->zerothElement, sh->capacity);
    }
    sh->zerothElement[sh->length] = element;
    sh->length++;
}

SliceHeader * make(int capacity)
{
    SliceHeader *sh = (SliceHeader *) malloc(sizeof(sh));

    sh->length = 0;
    sh->capacity = capacity;
    sh->zerothElement = (int *) malloc(capacity * sizeof(int));

    return sh;
}

int main()
{
    SliceHeader *sh = make(3);

    append(sh, 5);
    append(sh, 10);
    append(sh, 15);

    append(sh, 20); // exceed the original capacity, should reallocate

    for (int i = 0; i < sh->length; i++) {
        printf("%d\n", *((sh->zerothElement)+i) );
    }

    free(sh->zerothElement);
    free(sh);

    return 0;
}
我省略了空值检查,只显示与主要问题相关的部分

如果我使用这段代码,我可以使用append,而无需存储其返回值,也无需创建新的切片头

那么,如何在Golang中实现append函数,使其需要存储一个新的切片头呢?即使ZeroTheElement使用数组,这难道不意味着它只需要更改数组而不需要更改整个切片头吗

我错过了什么

谢谢:

基本上,为什么我们需要在Go中存储append的返回值

如果要使用带有附加值的切片,则只需存储此值

该功能实际上是如何实现的


Go是开源的,只需参考源代码即可。顺便说一句:这很无趣。

要附加的第一个参数是一个切片头,而不是指向切片头的指针。@Muffin Top啊,我肯定错过了。谢谢,伙计