是否可以将自定义类型断言为基本类型?
例如,如果我有以下内容
y.([]interface{})
然后,如果我尝试通过//interface {} is A, not []interface {}
输入assert,则会收到错误消息y.(A)
。
编辑:正如下面的回答所述,我可以断言通过x
键入A。问题源于Mongo驾驶员给出的bson.A
。一些驱动程序实现自己的类型,例如,正式的mongo驱动程序为[]interface
类型实现function buildQuiz() {
// we'll need a place to store the HTML output
const output = [];
// for each question...
myQuestions.forEach((currentQuestion, questionNumber) => {
// we'll want to store the list of answer choices
const answers = [];
// and for each available answer...
for (letter in currentQuestion.answers) {
// ...add an HTML radio button
answers.push(
`<label>
<input type="radio" name="question${questionNumber}" value="${letter}" id="botones">
${letter} :
${currentQuestion.answers[letter]}
</label>`
);
}
// add this question and its answers to the output
output.push(
`<div class="slide">
<div class="question"> ${currentQuestion.question} </div>
<div class="answers"> ${answers.join("")} </div>
</div>`
);
});
// finally combine our output list into one string of HTML and put it on the page quizContainer.innerHTML = output.join(""); }
类型。如果我切换驱动程序,则需要更改我的类型断言以匹配其自定义类型,这是我要避免的事情。
答案 0 :(得分:3)
当type asserting(为具体类型)时,您只能断言与接口值中存储的类型相同的断言,而不能断言其基本类型。当然,当您具有具体类型时,可以将其convert设为其基本类型。
您说过要避免这种情况,而不必避免引用具体类型。
为此,您需要反思。获取值的reflect.Value
描述符,并使用Value.Convert()
方法“直接”转换为其基类型,而跳过“实际”类型。这将成功,因为可以将值转换为其基本类型的值。
当然,Value.Convert()
方法将产生类型为reflect.Value
的值(而不是[]interface{}
),但是您可以使用{{3 }}。现在,您将拥有一个interface{}
,其中包装着类型为interface{}
的具体值,您现在可以从中键入assert类型为[]interface{}
的值。
请参见以下示例:
[]interface{}
输出(在Value.Interface()
上尝试):
z := reflect.ValueOf(y).Convert(reflect.TypeOf([]interface{}{})).
Interface().([]interface{})
fmt.Printf("%T %v", z, z)
这里有很多样板,而且效率不如简单的类型声明和转换那样高效。尝试避免这样做。
答案 1 :(得分:1)
您不能将type assert变量y
设置为[]interface{}
,因为y
的实际数据类型是A
(即使A
是别名) []interface{}
)。
工作示例:
fmt.Println(y.(A))
但是您可以使用conversion将数据类型为A
的变量转换为[]interface{}
。示例:
w := y.(A)
x := []interface{}(w)
// or
z := []interface{}(y.(A))