Golang 参数为接口类型怎么读取属性

深夜里的LED
  • 57

前提我的golang当前版本不支持泛型
以下代码的doRun函数不用类型断言怎么才能输出PhoneFoo的os属性呢?

package main

// Go 语言接口
import (
    "fmt"
)

type PhoneFoo interface {
    call()
}

type IPhoneFoo struct {
    os string
}

func (iPhone *IPhoneFoo) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func doRun(phone PhoneFoo) {
    // !!!这里要怎么才输出
    // PhoneFoo 的 os属性呢,只能用类型断言吗?
    fmt.Println(phone.os)
}

func main() {
    iPhone := &IPhoneFoo{os: "apple ios"}
    doRun(iPhone)
}
回复
阅读 791
2 个回答
麻瓜
  • 112

还可以使用反射, 对于 interface 的操作常用 reflect

package main

// Go 语言接口
import (
    "fmt"
    “reflect”
)

type PhoneFoo interface {
    call()
}

type IPhoneFoo struct {
    os string
}

func (iPhone *IPhoneFoo) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func doRun(phone PhoneFoo) {
    v := reflect.ValueOf(phone).Elem()
    os := v.Field(0)  // 获取索引为 0 的字段 os
    fmt.Println(os.Type())    // 字段类型
    fmt.Println(os.String())  // 调用 String()方法
    fmt.Println(os) // fmt 包中利用 reflect 处理 reflect.value 并调用 String() 方法
}

func main() {
    iPhone := &IPhoneFoo{os: "apple ios"}
    doRun(iPhone)
}

输出:
string
apple ios
apple ios

网上搜了一下,可以在interface接口中加一个getXXX方法来获取属性。只是种方式的话属性字段一多就有难维护。还有一种就是利用继承的方式再用类型断言。

type PhoneFoo interface {
    call()
    getOS()
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏