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

10 回复

判断实现了 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{} 这种形式的代码通常有几个目的,主要集中在以下几个方面:

  1. 占位符类型struct{} 是一个零大小的空结构体,用作占位符类型。它不会占用任何内存空间,但可以作为类型存在。这在需要类型但不希望引入额外内存开销的场景下非常有用,比如用作map的键类型,以表示一种唯一的存在性,而不关心具体值。

  2. 信号量或标志:在某些并发编程场景中,可以使用 struct{} 作为信号量或标志,通过 channel 传递来表示某个事件的发生。由于 struct{} 是零大小的,这种传递非常高效,几乎不消耗资源。

  3. 避免命名冲突:在某些泛型编程或接口设计中,使用 _ type = struct{} 可以定义一个独特的、不与现有类型冲突的类型。这有助于在复杂的类型系统中保持类型安全。

  4. 简化代码:在某些情况下,开发者可能只是需要一个简单的类型来满足接口或类型约束,而不关心类型本身的内容。这时,struct{} 作为一个空的结构体,是满足这一需求的最简单方式。

综上所述,_ type = struct{} 在Go语言中的使用,主要是为了提供一个轻量级的、零大小的、独特的类型,以满足特定的编程需求,同时保持代码的简洁和高效。

回到顶部