RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1430725
Accepted
ar rr
ar rr
Asked:2022-07-18 16:56:31 +0000 UTC2022-07-18 16:56:31 +0000 UTC 2022-07-18 16:56:31 +0000 UTC

Go 中的隐式引用(指针)

  • 772

我在 CodeWars 上解决简单的难题。以下代码有问题:

func FindOutlier(integers []int) int {
    coping := integers //делаем копию массива
    var DosZeroCount int = 0
    var DosZeroNotCount int = 0
    for index, _ := range coping {
        coping[index] = coping[index] % 2
        if coping[index] == 1 {
            DosZeroNotCount++
        } else {
            DosZeroCount++
        }
    }//обнуляется integers без одного элемента

问题是应对是对原始数组的隐式引用。根据语言描述,这样的动作coping := integers应该完全复制数组,而不是创建指向它的链接。如何复制整个数组?我怀疑重点是整数是一个函数参数......

golang
  • 1 1 个回答
  • 47 Views

1 个回答

  • Voted
  1. Best Answer
    Senior Pomidor
    2022-07-19T04:56:22Z2022-07-19T04:56:22Z

    使用数组和映射是不同的,您需要了解一些规则。

    coping := integers当您更改元素的状态但不希望它在地图或数组中更改时,可以在范围内工作。

        m := map[string]int{"a": 1, "b": 2, "c": 3}
        for k, v := range m {
            copyOfValue := v
            copyOfValue = 10
            v = 11
            fmt.Printf("copyOfValue: %s: %d\n", k, copyOfValue)
            break
        }
    
        fmt.Printf("m: %v\n", m)
    
    
    copyOfValue: c: 10
    m: map[a:1 b:2 c:3]
    

    for i := range a并且for i, v := range &a永远不要创建副本a,但在这里它for i, v := range a会创建一个副本))您只需要记住。在这里自己看看

    func IndexArray() {
        a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
    
        for i := range a {
            a[3] = 100
            if i == 3 {
                fmt.Println("IndexArray", i, a[i])
            }
        }
    }
    
    func IndexValueArray() {
        a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
    
        for i, v := range a {
            a[3] = 100
            if i == 3 {
                fmt.Println("IndexValueArray", i, v)
            }
        }
    }
    
    func IndexValueArrayPtr() {
        a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
    
        for i, v := range &a {
            a[3] = 100
            if i == 3 {
                fmt.Println("IndexValueArrayPtr", i, v)
            }
        }
    }
    
    func main() {
        IndexArray()
        IndexValueArray()
        IndexValueArrayPtr()
    }
    
    
    IndexArray 3 100
    IndexValueArray 3 4
    IndexValueArrayPtr 3 100
    

    播放链接

    因此,制作数组副本的最简单方法是

        src := []int{1, 2, 3, 4, 5}
        dst := make([]int, len(src))
        numberOfElementsCopied := copy(dst, src)
    

    现在谈谈切片(切片)

    Golang 有切片的概念——它几乎就像一个数组,只是它的行为不像一个数组。例如下面的代码将复制

    arr1:=[...]int{1,2,3}
    arr2:=arr1
    arr1[1]=99
    fmt.Println(arr1)
    fmt.Println(arr2)
    
    [1 99 3]
    [1 2 3]
    
    

    但是如果“复制”这样改变,那么原来的数组也会改变

    arr1:=[...]int{1,2,3}
    arr2:=arr1[:]
    arr1[1]=99
    fmt.Println(arr1)
    fmt.Println(arr2)
    
    [1 99 3]
    [1 99 3]
    

    这一切都是因为切片是指向数组的指针(更准确地说,新切片的每个元素都引用原始切片的一个元素)。

    切片不会复制切片的数据。它创建一个指向原始数组的新切片值。这使得切片操作与操作数组索引一样高效。因此,修改重新切片的元素(而不是切片本身)会修改原始切片的元素

    这里是源

    总计,以免混淆

    array := [5]int{1, 2, 3, 4, 5} // это массив
    slice := array[:]              // это срез массива
    slice := [...]int{1, 2, 3, 4, 5} // это срез массива
    slice := int{1, 2, 3, 4, 5} // это срез массива
    
    • 1

相关问题

  • windows上的protoc编译错误

  • 递归打印包依赖

  • Golang 算法 XTEA ECB 库“golang.org/x/crypto/xtea”

  • 如何将 IMEI 转换为字节并返回 golang

  • 如何创建文件并将其移动到新目录?

  • go中的函数参数中是否有cv-qualifier的类似物?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5