当前位置: 首页 > 面试题库 >

为什么不能更改类型结构范围内的值?

郏佐
2023-03-14
问题内容

这是我的第一篇文章,所以请对我“轻松”。:)
…我对许多传统的编程语言非常熟悉,但是我是Go语言的新手,很难理解切片和范围的用法。下面的程序代码和注释说明了我的震惊。谢谢!

package main

import (
    "fmt"
    "time"
)

type myStruct struct {
    Name  string
    Count int
}

编写了自己的Mod函数,因为在Go库中找不到。

func modMe(mod int, value int) int {
    var m int
    var ret int

    m = value / mod
    ret = value - m*mod
    return ret
}

func main() {
    mod := 4
    cnt := 16
    fmt.Printf("Record mod is %d\r\n", mod)

声明结构数组并添加一些记录

    chartRecords := []myStruct{}

    for i := 0; i<=cnt ;i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}                         //Load some data
        chartRecords = append(chartRecords,n)
    }

加载数据会产生我期望的输出

    fmt.Printf("======ORIGINAL LOADED VALUES========\r\n")                                  
    i := 0
    for _, elem := range chartRecords {
        fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out original values in the range
        i = i + 1
    }

现在,我修改值并打印它们,以查看它们是否显示为已修改。这看起来像预期的那样。

    fmt.Printf("======MODIFIED VALUES EXPECTED========\r\n")                                    
    i = 0
    for _, elem := range chartRecords {                                                 //looping thru the range of the data records
        mm := modMe(mod, i)                                                             //modMe is my function to return the Mod of a number based on moduls 'mod'
        elem.Count = mm                                                                 //assigning the new mod value to Count
        fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out this elem.Count element in the range
        i = i + 1                                                                       
    }

现在,我只需再次遍历同一范围并打印出相同内容即可。但是输出显示原始值。我不明白为什么会这样。我猜想它与切片和添加值而不是替换值有关。

    fmt.Printf("======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL========\r\n")                                         //Now lets loop through the same range
    i = 0
    for _, elem := range chartRecords {
        fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out this elem.Count element in the range
        i = i + 1
    }                                                                                   //But this output shows the original values  WHY??
    time.Sleep(60 * time.Second)
}

输出看起来像这样… 屏幕截图输出

预先感谢您的建议。


问题答案:

Go编程语言规范

对于带有范围子句的语句

带有“ range”子句的“
for”语句遍历数组,切片,字符串或映射的所有条目,或通道上接收到的值。对于每个条目,它会将迭代值分配给相应的迭代变量(如果存在),然后执行该块。

Go编程语言规范很容易阅读。

将更新后的elem迭代变量放回chartRecords切片中:

for i, elem := range chartRecords {
    elem.Count = modMe(mod, i)
    chartRecords[i] = elem
    fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)
}


 类似资料:
  • 问题内容: 我试图找出一种方法来更改每个打印的步骤值 我尝试过的 问题答案: 我建议为此使用循环实现自己的生成器。范例- 然后,您可以将其用作- 我们这样做是可以进行任何迭代的。 演示-

  • 问题内容: 在玩过Go HTML模板后,我发现所有用于遍历模板中对象的示例都是将切片的结构传递给模板,有点像此示例中所示: 其中“主要”模板为: 这有效,但是如果我仅使用.Name属性,则我不明白如何在每个ID旁边显示每个ID。我会发现在显示时将每个用户视为一个对象来对其属性进行分组会更合乎逻辑。 因此,我的问题是: 如果我想将结构片段传递给模板怎么办? 使它起作用的语法是什么?我尚未在官方htm

  • 我正在开发一个小的android演示应用程序,其中混合了一些java类和接口与kotlin。我想从一个名为MvpViewStateActivity的具有泛型类型参数的java类扩展: 其中只是一个空的java接口: MvpPresenter是这样一个java接口: 和SearchViewActivity(Java): 所以现在我创建了一个kotlin接口: 其中,Item是pojo数据类。 也是用

  • 我有一个包含复杂条目的数组列表的结构,我想将它们转换为浮点数。虚部可以丢弃,这很好。 我想知道,为什么这不起作用,而另一方面,在创建列表“数组”之前将类型更改为float会起作用。 这是一个非常基本的问题,但如果有人能分享他或她的想法,我将非常高兴。 感谢提前:)

  • 问题内容: 给你 为什么不选择1-11? 他们是只是决定随机执行此操作,还是有一些我没有看到的价值? 问题答案: 因为调用包含10个等于的元素更为常见。请记住,程序员更喜欢基于0的索引。 另外,请考虑以下常见代码段: 你能看到如果精确到这将是有问题的吗?程序员需要显式减1。这也遵循程序员喜欢的共同趋势。 如果你经常以1开头的范围调用范围,则可能需要定义自己的函数:

  • 问题内容: 在Java 7和更高版本中,菱形通常可以像这样毫无问题地用于推断类型: 但是,它不能用于这样的匿名内部类: 为什么是这样?从逻辑上讲,在这种情况下,我绝对可以将类型推断为。做出该决定的逻辑上的理由是,实际上不能在匿名内部类上推断类型,还是出于其他原因而将其省略了? 问题答案: 在JSR-334中: 不支持将Diamond与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不