Go语言中函数字面量类型前星号(*)的作用及代码语句解析
Go代码片段解析:最后一行与函数字面量类型前的星号
最后一行代码的作用
代码最后一行var _ QInterface = (*flType)(nil)是编译期接口实现校验,核心目的是确保*flType(flType类型的指针)完全实现了QInterface接口:
(*flType)(nil)是类型转换操作:把nil转换成*flType类型的指针值。因为nil可以代表任意指针类型的零值,这里用它生成一个*flType类型的空实例,不需要分配实际内存。var _ QInterface = ...是将转换后的指针赋值给匿名的QInterface类型变量(_是空白标识符,仅用于触发类型校验,不会创建实际可用的变量)。如果*flType没有实现QInterface的所有方法,编译器会直接抛出错误,让你在编码阶段就发现接口不匹配的问题,不用等到运行时才暴露。
函数字面量类型前星号的意义
这里的flType是通过type flType func(int) string定义的自定义函数类型,属于Go的值类型。*flType就是这个函数类型的指针类型,星号的作用和普通结构体、基本类型的指针完全一致:表示指向该值类型的指针。
需要明确两点:
- Go中函数类型本身是值类型,当你把函数赋值给变量时,本质是复制了函数的引用(但函数参数传递遵循值传递规则)。
- 如果给值类型
flType实现了方法,指针类型*flType会自动继承该方法;但如果只给*flType实现方法,值类型flType不会自动拥有该方法。这里特意校验*flType的接口实现,是一种防御性编程手段——哪怕后续把apply方法改成指针接收者,代码也能保证符合接口要求,避免修改后出现接口不兼容的问题。
内容的提问来源于stack exchange,提问作者You We Cho
相关产品推荐
相关产品推荐

