相关疑难解决方法(0)

golang切片是否超值?

在Golang,我正在尝试为我的旅行推销员问题制作一个争夺切片功能.虽然这样做我注意到当我开始编辑切片时,我给每个传递它时的加扰功能是不同的.

经过一些调试后我发现它是由于我编辑了函数内部的切片.但由于Golang应该是一种"通过价值传递"的语言,这怎么可能呢?

https://play.golang.org/p/mMivoH0TuV

我提供了一个游乐场链接来展示我的意思.通过删除第27行,您获得的输出与输入不同,这应该没有区别,因为该函数在作为参数传入时应该创建自己的切片副本.
有人可以解释这种现象吗?

pass-by-value go slice

32
推荐指数
4
解决办法
2万
查看次数

Golang追加()什么时候创建一个新切片?

根据内置的api文档,当原始切片的容量不够大时,append()将重新分配并复制到新的数组块.

这是用于创建字母组合(在本例中为布尔值)的递归算法的(简化版本).将字母表的成员(true,false)递归地添加到切片中,直到它是正确的长度,此时它通过通道发送.

package main

import (
    "fmt"
)

func AddOption(c chan []bool, combo []bool, length int) {
    if length == 0 {
        fmt.Println(combo, "!")
        c <- combo
        return
    }
    var newCombo []bool
    for _, ch := range []bool{true, false} {
        newCombo = append(combo, ch)
        AddOption(c, newCombo, length-1)
    }
}

func main() {
    c := make(chan []bool)
    go func(c chan []bool) {
        defer close(c)
        AddOption(c, []bool{}, 4)
    }(c)
    for combination := range c {
        fmt.Println(combination)
    }
}
Run Code Online (Sandbox Code Playgroud)

是此代码的操场链接.在输出中: …

go slice

7
推荐指数
2
解决办法
2218
查看次数

获取golang中指针数组的长度

我试图通过将该切片的指针传递给函数AppendVertex将顶点附加到顶点切片中,我知道如何通过使用len函数获取数组的长度,但是有没有办法获得长度指针数组?

type Vertex struct {
    X int
    Y int
}

func main() {
    var v []Vertex
    fmt.Println(len(v))
    appendVertex(&v)
    fmt.Println(len(v))

}

func appendVertex(v *[]Vertex) {

    *v = append(*v, Vertex{1, 1})

    fmt.Println(len(v))
}
Run Code Online (Sandbox Code Playgroud)

这个的结果是

prog.go:22:16: invalid argument v (type *[]Vertex) for len
Run Code Online (Sandbox Code Playgroud)

我还通过将指针传递给切片来做另一个版本,但是切片的大小没有改变,切片是不是参考类型结构?为什么这里的尺寸没有改变

type Vertex struct {
    X int
    Y int
}

func main() {
    var v []*Vertex
    fmt.Println(len(v))
    appendVertex(v)
    fmt.Println(len(v))

}

func appendVertex(v []*Vertex) {

    v = append(v, &Vertex{1, 1})

    fmt.Println(len(v))
}
?
Run Code Online (Sandbox Code Playgroud)

第二个结果是

0
1
0
Run Code Online (Sandbox Code Playgroud)

arrays pointers go

0
推荐指数
1
解决办法
3810
查看次数

为什么它无法通过函数调用修改切片的长度或容量?

我的目的是从特定切片中删除一个元素,代码如下:

func main() {
    s := []int{0, 1, 2, 3, 4}
    remove(s, 3)
    fmt.Println(s, len(s), cap(s))
}

func remove(s []int, idx int) {
    if idx < 0 || idx >= len(s) {
        return
    }
    copy(s[idx:], s[idx+1:])
    s = s[:len(s)-1]
    fmt.Println(s, len(s), cap(s))
}
Run Code Online (Sandbox Code Playgroud)

但输出显示:

[0 1 2 4] 4 5 [0 1 2 4 4] 5 5

据我所知,slice将作为引用类型传递给函数调用,为什么它不能修改它?

function go slice

-1
推荐指数
1
解决办法
89
查看次数

标签 统计

go ×4

slice ×3

arrays ×1

function ×1

pass-by-value ×1

pointers ×1