登录
首页 >  Golang >  Go问答

范围内的古怪行为

来源:stackoverflow

时间:2024-03-12 15:21:28 458浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《范围内的古怪行为》,涉及到,有需要的可以收藏一下

问题内容

考虑以下最小示例:

package main

import "fmt"

type runner interface {
    s1(int)
    s2(int)
}

type test struct {
    x1 []int
    x2 []int
}

func (t test) s1(v int) {
    t.x1 = append(t.x1, v)
    t.s2(v)
}

func (t test) s2(v int) {
    t.x2[v] = v
}


func main() {
    t := test{
        x1: make([]int, 0),
        x2: make([]int, 10)}

    for i := 0; i < 10; i++ {
        t.s1(i)
    }

    fmt.println(t)
}

现在如果你运行它,你将得到如下结果:

{[] [0 1 2 3 4 5 6 7 8 9]}

这意味着 x1 数组永远不会被填充。或者实际上,它是,但每次 s1 函数退出时都会重置。 s2 可以很好地将项目放入预定义的数组中。

有谁知道这里到底发生了什么吗?是因为数组修改的范围吗?这似乎有点违反直觉。

附注我确实知道 x1 是一个切片,其中 x2 是实际的预定义数组。我自己的理论是,如果您使用“切片”,它们只能在特定范围内更改,而不能在其他任何地方更改。


解决方案


值接收者制作类型的副本并将其传递给函数。
只需将其设置为指针即可:

func (t *test) s1(v int) {
    t.x1 = append(t.x1, v)
    t.s2(v)
}

输出:

&{[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]}

代码:

package main

import "fmt"

type runner interface {
    s1(int)
    s2(int)
}

type test struct {
    x1 []int
    x2 []int
}

func (t *test) s1(v int) {
    t.x1 = append(t.x1, v)
    t.s2(v)
}

func (t test) s2(v int) {
    t.x2[v] = v
}

func main() {
    t := &test{
        x1: make([]int, 0),
        x2: make([]int, 10)}

    for i := 0; i < 10; i++ {
        t.s1(i)
    }

    fmt.Println(t)
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《范围内的古怪行为》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>