登录
首页 >  Golang >  Go问答

为什么当函数的接收参数已经是interface时,还需要进行值类型到接口类型的转换?

来源:stackoverflow

时间:2024-03-05 19:09:21 382浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《为什么当函数的接收参数已经是interface时,还需要进行值类型到接口类型的转换?》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

table := s.Model(reflect.New(destType).Elem().Interface()).RefTable()

func (s *Session) Model(dest interface{}) *Session { 
    log.Info(reflect.TypeOf(dest))
    if s.refTable == nil || s.refTable != dest { 
        s.refTable = schema.Parse(dest, s.dialect)
    }
    return s
}

//turns a dest into *Schema
func Parse(dest interface{}, dialect dialect.Dialect) *Schema {
    modelType := reflect.Indirect(reflect.ValueOf(dest)).Type()
    schema := &Schema{
        //Model: modelType,
        Model:    dest, //
        Name:     modelType.Name(),
        FieldMap: make(map[string]*Field), //
    }

    for i := 0; i < modelType.NumField(); i++ {
        p := modelType.Field(i)
        if !p.Anonymous && ast.IsExported(p.Name) {
            field := &Field{
                Name: p.Name,
                //Type: dialect.DataTypeOf(reflect.Indirect(reflect.ValueOf(p.Type))), //
                Type: dialect.DataTypeOf(reflect.Indirect(reflect.New(p.Type))), //
            }
            if t, ok := p.Tag.Lookup("geeorm"); ok {
                field.Tag = t
            }
            schema.FieldNames = append(schema.FieldNames, p.Name) //
            schema.Fields = append(schema.Fields, field)
            schema.FieldMap[p.Name] = field
        }
    }
    return schema
}

这一行:table := s.model(reflect.new(desttype).elem().interface()).reftable() 模型函数参数已经是interface{},为什么需要使用“.interface()”将值类型转换为interface{}?


正确答案


interfacereflect.value 类型上调用。它返回您正在使用反射的对象的实际值。在这种特殊情况下,此调用的返回值被强制转换为具体类型(s.model),因此它本质上所做的是:

destTypeValueAsInterface := reflect.New(destType).Elem().Interface()
sModel := s.Model(destValueAsInterface)
table := sModel.RefTable()

本质上,调用 interface 来访问 desttype 对象,它被转换为 s.model 类型(我怀疑它是 type 模型接口 ,无论 s 是什么包),所以方法 reftable可以调用zqb。

这种反射可以在 gorm 或编组包(encoding/json 等)等包中看到。不过,由于不知道您要做什么,我建议您通过利用接口来尽可能避免代价高昂的反射,并且从 go 1.18 开始,尽可能多地利用泛型。

到这里,我们也就讲完了《为什么当函数的接收参数已经是interface时,还需要进行值类型到接口类型的转换?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>