【发布时间】:2016-09-18 15:23:01
【问题描述】:
例如,我有两个不同的结构 Foo 和 Bar
struct Foo {...}
struct Bar {...}
以及许多基于它们构建的函数和其他类型。
C++ 风味:
template<typename T>
struct Identified {
T model;
std::string id;
};
template<typename T>
Identified<T> GetIdentifiedModel(std::string id) {
Identified<T> result;
T.id = id;
T.model.set(getSomeData(id)); // Common method for T
return result;
}
如何在 Go 中实现这些示例?
对于常用方法,接口可以完成这项工作,但我不知道如何从接口中检索特定类型来声明它、返回它或其他任何东西,而且我不能再处理复制/粘贴代码了 :)
谢谢!
编辑@Amd:https://ideone.com/rqpsQb
#include <string>
#include <iostream>
struct Foo {
char c;
void set(std::string s) {c = s[0];}; // We don't really care here
};
struct Bar {
int n;
void set(std::string s) {n = s.size();}; // We don't really care here
};
template<typename T>
struct Identified {
T model;
std::string id;
};
template<typename T>
Identified<T> GetIdentifiedModel(std::string id) {
Identified<T> result;
result.id = id;
// Obviously shouldn't be ID but for the example
result.model.set(id); // Common method for T
return result;
}
void assert(bool b) {
if (b) std::cout << "OK" << std::endl;
else std::cout << "There is a problem !" << std::endl;
};
int main() {
auto fooWithID = GetIdentifiedModel<Foo>("foo id");
auto barWithID = GetIdentifiedModel<Bar>("bar");
assert (fooWithID.model.c == 'f');
assert (barWithID.model.n == 3);
return (0);
}
【问题讨论】:
-
缺乏泛型/模板是对 golang 的主要批评。你不能这样做,至少在谷歌将它们添加之前
-
@DavidHaim:缺乏泛型/模板是 golang 的一大特点。 :-)
-
@KerrekSB 如果重新实现每个机制 10 次是一项功能,我同意