- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我有下一个 c 程序:
#include <stdio.h>
int main(int args, char* argv[])
{
enum RC {
APPLE=0,
ORANGE,
PEAR,
BANANA=99,
GRAPE
};
printf("%d, %d, %d, %d, %d\n", APPLE, ORANGE, PEAR, BANANA, GRAPE);
}
输出是:
0, 1, 2, 99, 100
如果在 go 中,我如何使用更多 golang 方式
来处理它?</strong>
其实如果我只是想跳过一些值。例如print 0, 1, 2, 5, 6
,然后我可以使用 next 跳过一些值,但这里我需要跳过 96 个值...
package main
import "fmt"
func main() {
const (
APPLE = iota
ORANGE
PEAR
_
_
BANANA
GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}
而且,我也可以使用 next,但是在 GRAPE
之后我仍然有很多 const 变量...
package main
import "fmt"
func main() {
const (
APPLE = iota
ORANGE
PEAR
BANANA = 99
GRAPE = 100
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}
那么,有没有更多的golang方式
让我处理这种情况?
最佳答案
您可以移动 iota
有一个常量,并将后续的初始化表达式留空:
const (
APPLE = iota
ORANGE
PEAR
BANANA = iota + 96 // 96 is manually calculated to get 99
GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
这将输出(在 Go Playground 上尝试):
0 1 2 99 100
虽然如果您在 BANANA
之前插入元素,BANANA
的值和后续常量将会改变。
如果你想避免这种情况,打破常量组,并开始一个新的(iota
的值重置为 0
每当保留字 const
出现在源代码中):
const (
APPLE = iota
ORANGE
PEAR
)
const (
BANANA = iota + 99 // iota is reset to 0
GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
输出是一样的。在 Go Playground 上试试这个.
如果不想破坏常量组,还是有办法的。
在你想“打破”编号的地方引入一个常量,并在随后的行中从 iota
中减去它的值。这将导致 1
,因此将其与您要继续的减 1 相移。这样即使您在 BANANA
之前插入元素(但不在 _BREAK
和 BANANA
之间),BANANA
的序数和后续常量不会改变。
const (
APPLE = iota
ORANGE
PEAR
_BREAK
BANANA = iota - _BREAK + 98 // Continues from 98 + 1 = 99
GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
再次输出相同。在 Go Playground 上试用.
根据您的喜好,_BREAK
可以用 iota + 1
初始化,因此应用于下一个常量的偏移量将是它获得的值:
const (
APPLE = iota
ORANGE
PEAR
_BREAK = iota + 1
BANANA = iota - _BREAK + 99 // Continues from 99
GRAPE
)
在 Go Playground 上试试这个.使用您看起来更容易的那个。
关于go - 如何在使用 iota 定义 const 变量时跳过很多值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57053373/
我假设“i”是递增的,而“a”是分配的,但我无法弄清楚或找到答案。此外,它看起来与我认为令人困惑的非标准 itoa 非常相似。 最佳答案 C++ iota 不是首字母缩写词或首字母缩写词。就是“iot
在下面的代码中: const ( signature uint32 = 0xae3179fb dhkxGroup = 2 ReplySuccessful byte = iota
这三种填充 vector 的方式之间是否存在性能差异? #include #include #include #include int main() { std::vector v(1
iota 模板函数已添加到标准库中,以用递增的值序列填充迭代器范围。 template void iota(ForwardIterator first, ForwardIterat
iota函数以前在 中 header 。已改为 . 我需要保留旧方法以实现向后兼容性,因此我想使用预处理器选项来选择要包含的正确 header 。 这什么时候改变了,我应该使用哪个预处理器选项?
以下示例使用 iota 定义了一系列从 3333 开始的端口号。 package main import ( "fmt" ) const ( FirstPort = iota+3333 Sec
来自 Python 世界,我找到了函数 std::iota非常有限。为什么接口(interface)被限制为不带任何 UnaryFunction ? 例如我可以转换 >>> x = range(0,
作为标题,golang中iota的全称是什么(不是用法): const ( // iota is reset to 0 c0 = iota // c0 == 0 c1 = iota
Iota 是一种非常小的“编程语言”,只使用一个组合器。我有兴趣了解它的工作原理,但是以我熟悉的语言查看实现会很有帮助。 我找到了一个用 Scheme 编写的 Iota 编程语言的实现。不过,我在将其
ranges-v3库中的closed_iota和iota有什么区别? 最佳答案 第二种遵循标准的C++表达范围的方法-默认为右侧打开范围。第一个是包容性的。iota接受两个参数:start和end。它
由于没有基于索引的parallel for algorithm在 c++17 , 我想知道 ranges::view::iota可以与std::for_each结合使用模仿那个。即: using na
再次提出这个问题,我深表歉意。我之前就 Haskell 实现问过这个问题 here ,但我仍然难以理解这是如何工作的。此外,我发现极简编程语言的概念绝对令人着迷并且无法摆脱它......无论如何,这不
我最近一直在利用 iota递增 int 类型 vector 的语句.但现在我正在尝试使用该语句来递增具有 2 个成员的显式类。 下面是整数 vector 的用法: vector n(6); iota
为了了解 C++11 的复杂性,我正在研究 unique_ptr有一点。 我想知道,有什么办法可以使用iota吗?初始化 unique_ptr 的容器? 我从 unique-ptr-less 解决方案
我试图编译这段代码:- #include using namespace std; int main() { vector v(5); iota(v.begin(), v.end()
以下程序打印出一副洗好的纸牌(作为整数): #include #include #include #include typedef unsigned int card; typedef std
请原谅我对 Go 的了解非常有限。我有这样的定义 type ErrorVal int const ( LEV_ERROR ErrorVal = iota LEV_WARNING
我有这个 Go 代码: package main import "fmt" type baseGroup int const ( fooGroup baseGroup = iota + 1
假设我们有一个 map[int]string我们想这样定义它: var a map[int]string = { 1: "some" 3: "value" 4: "maintained" 7
假设我有下一个 c 程序: #include int main(int args, char* argv[]) { enum RC { APPLE=0, OR
我是一名优秀的程序员,十分优秀!