草庐IT

戈朗 : declaring maps and slices with iota values

coder 2024-07-10 原文

我有这个 Go 代码:

package main

import "fmt"

type baseGroup int

const (
    fooGroup baseGroup = iota + 1
    barGroup
)

var groups = [...]string{
    fooGroup: "foo",
    barGroup: "bar",
}

var xGroups = map[baseGroup]string{
    fooGroup: "foo",
    barGroup: "bar",
}

func main() {
    fmt.Println("groups")
    for k, v := range groups {
        fmt.Println(k, v)
    }

    fmt.Println("xGroups")
    for k, v := range xGroups {
        fmt.Println(k, v)
    }
}

如果我运行我得到的代码:

groups
0 
1 foo
2 bar
xGroups
1 foo
2 bar

我想知道为什么输出不同?

最佳答案

您期望 range 在两种类型上的行为相同,但在第一种情况下,它在一个数组上取值,而您只有一个空索引 0。该值存储在 k 中 为当前索引; 0, 1, 2。在您的第二个示例中,您在 map 上进行测距并获取存储在 k 中的 key ,其中仅包含 1 和 2。

您可能想知道这是怎么发生的?就是因为这个;

var groups = [...]string{
    fooGroup: "foo",
    barGroup: "bar",
}

有点困惑(我觉得非常糟糕)的代码给了你这个;

var groups = [...]string{
    1: "foo",
    2: "bar",
}

这导致 groups 被分配/初始化为索引 0 中的空字符串。当然, map 不需要键 0 来让你在键 1 中放一些东西,所以它不会遇到同样的问题。如果这不仅仅是一个演示语言特性的练习,我强烈建议您摆脱故意混淆的代码,并为常量、类型和初始化使用更清晰的结构。

如果您对该机制持怀疑态度,请将以下几行添加到您的 main 中,您可以清楚地看到

fmt.Printf("Lenght of groups is %d and index 0 is %s\n", len(groups), groups[0])
fmt.Printf("Lenght of xGroups is %d\n", len(xGroups))

关于戈朗 : declaring maps and slices with iota values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303966/

有关戈朗 : declaring maps and slices with iota values的更多相关文章

  1. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  2. UE4/UE5 打包发布与补丁 - 2

    目录必要说明:一、准备二、项目1.打开插件2.添加模块到xxx(项目名字).Build.cs文件3.创建GameInstance(C++类)4.创建和配置蓝图文件4.1.创建蓝图Gameinstance并继承MyGameInstance4.2.配置下载文件块4.3.创建GameMode(蓝图即可) 4.4.创建一个空白的关卡5.创建DataAsset6.项目设置 6.1DefaultGame.ini6.2ProjectSetting7.项目打包设置三、服务器1.安装Web服务器2.配置Web服务器2.1.打开服务器2.2.选择刚刚创建的服务器2.3.选择MIME类型2.4.在右侧空白的地方:右

  3. UE4(虚幻4)预算上的纹理流送池(texture streaming poor over)报警解决方法 - 2

    UE4系列文章目录文章目录UE4系列文章目录前言一、第一种方法:修改配置文件(不得行)二、第二种方法:项目设置(可行)前言我们在运行UE4程序时会遇到警告:预算上的纹理流送池,虽然不影响程序正常运行,但就是看着挺刺眼的。有强迫症的我是在忍不哈,于是决定灭了他_一、第一种方法:修改配置文件(不得行)问了一下度娘:纹理流送是运行时将纹理加载和卸载进出内存的系统,当场景中的纹理流送超过默认值将会产生警告,解决方法有两种:1.通过命令行修改流送池单位;2.通过修改\Engine\Config\ConsoleVariables.ini,修改流送池单位:;TextureStreamingPoolValue

  4. 戈朗 "Log in to the site and download the xls file"? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion告诉我如何使用Golang登录网站。下载xls文件是得到了,但是为了在Excel表格中有数据,需要登录网站。该站点位于公司的服务器上。如果你能告诉你怎么做。例如,我用来执行此操作的VBA代码。SetoFields=CreateObject("Scripting.Dictionary")WithoFields.Add"login","sdiscor".Add"password","sdiscor"EndWi

  5. arrays - 戈朗 : Could not understand how below code is executing - 2

    下面是我查询的代码:我有一个单维数组a当我打印a[0][0]时,我不明白为什么它返回字符a的ascii值:packagemainimport("fmt")funcmain(){a:=[3]string{"a","b","c"}fmt.Println(a[0][0])}输出:97 最佳答案 下面是如何打印ascii的代码示例a:=[3]string{"a","b","c"}for_,rune:=rangea{fmt.Println(rune)//Itwillprinta,b,c}因为你在你的代码中使用了[0][0],所以它是等价的fo

  6. UE5.1.1创建C++工程失败解决办法 - 2

    闲来无事,更新了一下UE5.1.1,妈蛋创建C++项目居然失败,错误截图如下:妈蛋,后面一堆乱码,鬼知道是啥错误!咋解决?步步高打火机,直接复制第一段的Running后面的代码到cmd中执行。这下看的懂了,‘dotnet’不是内部或外部命令,也不是可运行的程序一般出现xxx不是内部外部命令都是没有设置环境变量。找到5.1.1的目录下的Engine/Build/BatchFiles/Build.bat就调用一个同级目录下的GetDotnetPath.bat的文件,再次找到并打开GetDotnetPath.batGG,原来就是将引擎安装目录下的Dotnet指定到PATH中。再打开电脑的系统环境变量

  7. 戈朗 :which way is more efficient about using "for range" - 2

    typepath[]bytefunc(ppath)ToUpper(){fori,b:=rangep{if'a'在上面(这个例子是从“TheGoBlog”复制过来的),如果ToUpper变成这样:func(ppath)ToUpper(){fori,_:=rangep{if'a'哪个会更有效率为什么?“TheGoBlog”对前一个说:“这里的ToUpper方法在forrange构造中使用两个变量来捕获索引和slice元素。这种形式的循环避免了在主体中多次写入p[i]。”什么意思? 最佳答案 前者有更多的内存操作,即在b上:它在循环的第一

  8. 戈朗 : go command inside script? - 2

    我有一个用Golang编写的脚本,我不太明白。我想知道他为什么要在脚本里面写goserver.Start()?为什么不简单地编写server.Start?packagemainimport("github.com/miekg/dns""testing""time")constTEST_ADDR="127.0.0.1:9953"funcTestDNSResponse(t*testing.T){server:=NewDNSServer(&Config{dnsAddr:TEST_ADDR,})goserver.Start()//Allowsometimeforservertostarttim

  9. 戈朗 : Is there a way to modify one of the multi-value return parameters in one line? - 2

    我正在尝试在Go中做一些相对简单的事情——将字符串转换为整数,然后将其加倍:myInt,_:=strconv.Atoi(args[1])doubleArg:=myInt*2由于Atoi()返回两个参数(整数和err),我使用myInt,_:=来检索值的整数。我想将它加倍(因此是第二行)但不能在一行中完成所有操作:myInt,_:=strconv.Atoi(args[1])*2给我:multiple-valuestrconv.Atoi()insingle-valuecontext但是,根据我使用大多数其他语言的经验,必须在两行中执行此操作似乎有很多样板。这只是我必须处理的一个限制,还是有

  10. elasticsearch - 戈朗错误 "not enough arguments in call" - 2

    我刚接触golang。尝试通过golang实现批量上传到Elasticsearch。我正在使用golang库->https://github.com/olivere/elastic用于与Elasticsearch通信。此外,我正在尝试一段示例代码,但出现以下错误...suresh@BLR-245:~/Desktop/tools/golang/src$goinstallgithub.com/crazyheart/elastic-bulk-upload#github.com/crazyheart/elastic-bulk-uploadgithub.com/crazyheart/elasti

随机推荐