标题
[golang的坑]匿名结构体与结构体中的匿名成员 -- golang 中访问结构体匿名成员的终极方法
clq
浏览(450) +
2023-02-17 13:53:42 发表
编辑
关键字:
[2023-02-17 15:22:59 最后更新]
[golang的坑]匿名结构体与结构体中的匿名成员 -- golang 中访问结构体匿名成员的终极方法
https://blog.csdn.net/u012538549/article/details/95779362
Go允许我们定义不带名称的结构体成员,只需要指定类型即可;这种结构体成员称作匿名成员。这个结构体成员的类型必须是一个命名类型或者指向命名类型的指针。我们在访问最终需要的变量时,可以省略中间所有的匿名成员。匿名成员拥有隐式的名字,所以不能在一个结构体里面定义两个相同类型的匿名成员。可导出性也由它们的类型决定(首字母是否大写)。
type Wheel struct {
circle
}
type circle struct {
X, Y int
}
// 另一个包
var w Wheel
w.X = 8 // 编译通过
w.circle.X = 8 // 编译错误
--------------------------------------------------------
我碰到的是 govcl 中 tmainform 无法将指针传递给 tform 。代码如下的结构体
type vcl_TForm *vcl.TForm ;
type TMainForm struct {
//vcl_TForm
*vcl.TForm //clq / 没有为成员指定名称 //匿名成员的结构体:指结构体中的成员没有名称
//那么要怎样访问呢?
//_form *vcl.TForm; //奇怪的是,是不能写成这样的
string //clq add 只是用来测试如何访问 匿名成员
//--------
Btn1 *vcl.TButton;
参考
https://www.cnblogs.com/gardenofhu/p/9010638.html
可知,通过直接将类型名当做字段名即可访问匿名成员!
例如
(f *TMainForm)
... ...
fmt.Println(f.string); //可以这样访问 匿名成员。但又访问不了指针
f.*vcl.TForm 或者 f.vcl_TForm 或者 f.(*vcl.TForm) 都是失败的。
用 unsafe.Pointer 在中间做转换访问是失败的。
////js_main((*vcl.TForm)(unsafe.Pointer(f))); //编译通过而已,实际上运行是错误的
用 unsafe.Pointer 在中间做转换访问是失败的。
//var form vcl.IWinControl; //要用接口中转,不过不一定需要准确的类型,直接象后面的这样给 interface{} 就行
// form = f;
// var form2 interface{};
// form2 = f;
//js_main(form.(*vcl.TForm)); //通过 vcl.IWinControl 中转后 ok //也是可以编译,但运行出错的
//js_main(form2.(*vcl.TForm)); //通过一个 interface{} 中转后再断言也可以 //也是可以编译,但运行出错的
//js_main(f.(*vcl.TForm)); //直接断言是不行的,这时会提示 f 不是接口
最终的答案很牛叉:
js_main(f.TForm);
!!! 也就是说至少在目前的 golang 版本中(1.18)这个匿名成员的名称(其实是类型)不能带有包名前缀,还要把指针中的 * 去掉。
这就怪了,那么假如同时存在 *vcl.TForm 和 vcl.TForm 的两个匿名成员呢?
答案是不能再定义,会报 TForm redeclared !!!
******vcl.TForm //同理,再多级的指针声明也是不能允许的
这个显然是编译器的限制,很有可能在后面的 golang 新版本中有处理的语法或办法。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.