将类型断言自定义类型更改为基本类型

时间:2019-06-25 05:37:58

标签: go types type-conversion type-assertion

是否可以将自定义类型断言为基本类型?

例如,如果我有以下内容

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(""); } 类型。如果我切换驱动程序,则需要更改我的类型断言以匹配其自定义类型,这是我要避免的事情。

2 个答案:

答案 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))