问题标签 [type-switch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1154 浏览

types - GoLang 类型开关中变量“t”的实际类型是什么?

鉴于:

如果我打电话:

声明时变量的实际类型t是什么?为了说明这个问题:如果我想写

我将如何申报t

例如在 Delphi 中,我们有这样的结构:

我相信我正在 GoLang 中寻找类似于 的东西,它具有潜在的价值,TTypeKind例如等。tkIntegertkString

在 C++ 中,我们找到了type_info类类型,它也提供了一些这种功能。

我将tvar t...声明中使用什么类型?这甚至可能吗?

0 投票
2 回答
1119 浏览

go - Handle different types of messages - one or many channels?

Consider this simple code:

I'd like to change MyProcess to support 2 different kinds of messages. I have 2 ideas:

a) Type switch

b) Two channels

  1. What's the functional difference between the two implementations? One thing is the ordering differences - only the first one guarantees that the messages (Message and OtherMessage) will be processed in the proper sequence.

  2. Which one is more idiomatic? The approach 'a' is shorter but doesn't enforce message type correctness (one could put anything in the channel). The approach 'b' fixes this, but has more boilerplate and more space for human error: both channels need to be checked for closedness (easy to forget) and someone needs to actually close both of them (even easier to forget).

Long story short I'd rather use 'a' but it doesn't leverage the type system and thus feels ugly. Maybe there is an even better option?

0 投票
1 回答
540 浏览

go - 在 Go 中,有没有办法比较两个没有嵌套 switch 语句的混合类型接口?

我发现Go 的interface{}类型是该语言最好的也是最烦人的特性。我正在尝试创建一个简单的用户可自定义验证规则解决方案,用户可以在其中定义:

  • 比较运算符。
  • 比较操作数。
  • 指向要测试的值的映射键。

以及一个简单的布尔表达式解析器,允许用户使用 AND 和 OR 组合多个规则。到目前为止,一切运行良好,表达式可以成功解析、标记和评估,但它在给定数据上运行规则会导致问题。

这是实际评估数据的函数的当前版本:

目前,运算符暗示数据是否为数字(大于、小于等)。int 的类型断言在构建包的其他部分时完成了这项工作,但完成的系统也应该能够采用 float64 并能够处理混合类型比较。

目前我能看到的唯一方法是使用多个嵌套类型开关,每个开关都有一个级别:

  • 运营商。
  • 给定字段值的类型。
  • 比较操作数的类型。

但这有可能变得非常大并且不容易管理。是否有一种我看不到的“更清洁”的方法来执行此操作,或者我是否使用嵌套开关卡住了?

0 投票
1 回答
1453 浏览

go - 如何在结构字段上使用类型开关(当字段是接口类型时)?

见:http ://play.golang.org/p/GDCasRwYOp

我需要根据结构字段的类型做一些事情。

当字段为接口类型时,以下内容不起作用。

我想我明白为什么这不起作用。但是有没有办法做我想做的事?

0 投票
1 回答
4386 浏览

json - 将带有变量类型的json转换为字符串

我正在从 API 响应中读取 json,但遇到了一个问题,即 json 值中有多种数据类型(字符串、null、bool)。此外,一些键的值可以是字符串或空值,这使得将数据读入类型变得更加困难。我想将所有内容都转换为字符串以便于处理。我基于谷歌搜索其他示例创建了一个类型开关。我想知道这是否是最简单的方法,或者我是否缺少更简单的方法。

最终格式需要一片地图 [{ "t_int": "1", "t_bool": "true", "t_null_string": "" }, { "t_int": "2", "t_bool": "false", “t_null_string”:“string1”}]

0 投票
1 回答
200 浏览

go - 如何区分类型开关中的 rune 和 int32 值?

有以下代码

我收到编译错误

如果我将符文包装在我自己的类型中,则类型开关会编译并工作

https://play.golang.org/p/2lMRlpCLzX

这是为什么?如何区分类型开关中的 rune 和 int32?

0 投票
1 回答
2069 浏览

go - Go:类型 switch 断言中的这种多重 case 条件有什么问题?

我的代码通常是这样的:

然后在编译时出现错误: cannot range over data (type interface {}),它是由第一个range.

如果我在第一种情况下删除了多种类型,这意味着将其保留为case map[string] *model.SnapshotByConv:

然后编译错误消失了,写出来了,我需要对这两种类型进行完全相同的逻辑,那为什么我不能把它们放在同一个case

请帮忙,谢谢。

我认为这里的情况与这里已经有答案的情况不同:golang multiple case in type switch,它试图找到一种识别类型的方法,但我只是不想识别某些类型,只是简单地在上面运行一些逻辑,我找不到一种优雅的方法来做到这一点。

0 投票
1 回答
452 浏览

go - 我们可以为 Go 中的错误创建子类型吗?

我想在 Go 中创建分层错误。我们可以在 Go 中实现这一点吗?例如,我有以下两个错误。

我想要一个CommonError由两个子类型Error1和组成的错误类型Error1,以便我可以执行以下操作。

有没有办法做到这一点?

编辑:

在类型切换中,我们可以像这样使用多个错误: case Error1, Error2:但是当我有大量错误时,或者当我需要对模块内的错误进行一些抽象时,这种方法将不是最好的方法。

0 投票
1 回答
101 浏览

go - 如何在 Go 中创建多级错误子类型

我试图在 GO 中创建错误的子类型。我之前就这个问题问过一个问题。

现在我面临多种类型的问题。以下代码显示了错误类型定义:

当我尝试运行以下代码时:

printType()函数打印以下内容:

我需要将 的类型Error3标识为UniversalError,而不是CommonError1. 我怎样才能做到这一点?我的方法有什么问题吗?

0 投票
0 回答
437 浏览

go - 有没有办法将案例动态添加到 golang 类型开关?

我有一个简单的类型开关,我需要根据它接收到的类型执行操作。但是我想添加方法以动态地根据某种类型运行。

我有一个名为“Register”的方法,在该方法中我注册了一个要为某个 reflect.Type T 执行的函数。这些转换将存储在一个映射中,其键是实际类型。

现在我想遍历这个映射并将案例动态添加到我的 TypeSwitch 中,因此将为它各自的类型执行正确的方法,我不知道这是否可能在 go 中。我尝试在反射包中寻找它,但唯一的选项似乎做了类似于选择操作的事情。好吧,由于我不在这里处理频道,我真的只需要动态地将案例添加到我的交换机。

这甚至可能吗?有没有类似于SelectCase反射包的东西?