MST

星途 面试题库

面试题:Go自定义类型在接口实现中的边界情况

定义一个接口`type Printer interface { Print() string }`,然后创建一个自定义类型`type MyStruct struct { Data []int }`。要求实现`Printer`接口的`Print`方法。在实现过程中,考虑`Data`字段为空切片(这是一种边界情况)时,如何正确输出有意义的信息。并且说明在接口类型断言时,针对这种自定义类型及边界情况可能遇到的问题及解决办法。
12.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

type Printer interface {
    Print() string
}

type MyStruct struct {
    Data []int
}

func (m MyStruct) Print() string {
    if len(m.Data) == 0 {
        return "Data is an empty slice"
    }
    return fmt.Sprintf("%v", m.Data)
}

接口类型断言问题及解决办法

  • 可能遇到的问题:在进行接口类型断言时,如果实际类型不是MyStruct,会导致类型断言失败,引发运行时错误。例如:
func main() {
    var p Printer = &MyStruct{Data: []int{1, 2, 3}}
    if ms, ok := p.(*MyStruct); ok {
        fmt.Println(ms.Print())
    } else {
        fmt.Println("Type assertion failed")
    }
    // 如果 p 实际指向的不是 *MyStruct 类型,ok 会为 false,此时若直接使用 ms 会导致运行时错误
}
  • 解决办法:使用类型断言时采用带检测的方式,如上述代码中使用if ms, ok := p.(*MyStruct); ok这种方式,先判断类型断言是否成功,oktrue时才对ms进行操作,避免运行时错误。另外,也可以使用switch语句进行类型断言,这样可以同时处理多种类型:
func main() {
    var p Printer = &MyStruct{Data: []int{1, 2, 3}}
    switch v := p.(type) {
    case *MyStruct:
        fmt.Println(v.Print())
    default:
        fmt.Println("Unexpected type")
    }
}