Golang Go语言中预先写一堆 `_ type = struct{}` 的目的是什么
比如 gin/redner/render.go
var (
_ Render = JSON{}
_ Render = IndentedJSON{}
_ Render = SecureJSON{}
_ Render = JsonpJSON{}
_ Render = XML{}
_ Render = String{}
_ Render = Redirect{}
_ Render = Data{}
_ Render = HTML{}
_ HTMLRender = HTMLDebug{}
_ HTMLRender = HTMLProduction{}
_ Render = YAML{}
_ Render = Reader{}
_ Render = AsciiJSON{}
_ Render = ProtoBuf{}
)
预先写这一堆的目的是什么呢?
Golang Go语言中预先写一堆 `_ type = struct{}` 的目的是什么
更多关于Golang Go语言中预先写一堆 `_ type = struct{}` 的目的是什么的实战教程也可以访问 https://www.itying.com/category-94-b0.html
判断实现了 render interface
更多关于Golang Go语言中预先写一堆 `_ type = struct{}` 的目的是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
验证 JSON 这个结构体是否实现了 Render 这个接口。如果没有实现的话,在编译的时候会报错。
Render 是个接口吧?为了检查是否实现了相关方法
相当于 static_assert ,脱裤子放屁之举。
明白了。
。。一时半会儿没转过来。就是用 IDE 的时候,实现没实现在用的时候立刻就能知道了。
这是防止“出错”是吧
不愧是大道至简
可能相当于 python 里通过判断 print 'hello world'
这种语句能否执行,进而判断当前 python 版本?
>>> try:
… exec(“print ‘hello world’”)
… except SyntaxError:
… py_version = 3
… else:
… py_version = 2
…
>>>
因为接口是鸭子类型。灵活是灵活,但有时想编译阶段就能显示判断是否结构体实现了接口,就有了这种写法。我觉得还是不错的。在有了泛型后,go 现在最大的诟病就是错误处理的样板戏了,其实就用?判断 error 不为空就往上抛就完事了,不知道为什么拖到现在都不愿意去弄。国产七牛魔改的 go+早好几年前错误处理就这么干了。
大佬, 这个写法叫什么名字?
在Golang(Go语言)中,使用 _ type = struct{}
这种形式的代码通常有几个目的,主要集中在以下几个方面:
-
占位符类型:
struct{}
是一个零大小的空结构体,用作占位符类型。它不会占用任何内存空间,但可以作为类型存在。这在需要类型但不希望引入额外内存开销的场景下非常有用,比如用作map的键类型,以表示一种唯一的存在性,而不关心具体值。 -
信号量或标志:在某些并发编程场景中,可以使用
struct{}
作为信号量或标志,通过 channel 传递来表示某个事件的发生。由于struct{}
是零大小的,这种传递非常高效,几乎不消耗资源。 -
避免命名冲突:在某些泛型编程或接口设计中,使用
_ type = struct{}
可以定义一个独特的、不与现有类型冲突的类型。这有助于在复杂的类型系统中保持类型安全。 -
简化代码:在某些情况下,开发者可能只是需要一个简单的类型来满足接口或类型约束,而不关心类型本身的内容。这时,
struct{}
作为一个空的结构体,是满足这一需求的最简单方式。
综上所述,_ type = struct{}
在Go语言中的使用,主要是为了提供一个轻量级的、零大小的、独特的类型,以满足特定的编程需求,同时保持代码的简洁和高效。