面试题答案
一键面试类型断言的作用
类型断言用于在运行时判断接口值所存储的具体类型,并将接口值转换为该具体类型。它允许我们在知道接口值实际类型的情况下,进行类型特定的操作。如果断言失败,会触发运行时恐慌(panic),除非使用了带comma-ok形式的断言,这种形式不会触发恐慌,而是返回一个标志位表示断言是否成功。
实际应用场景
- 根据不同类型执行不同逻辑
package main
import (
"fmt"
)
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func PrintArea(s Shape) {
if circle, ok := s.(Circle); ok {
fmt.Printf("Circle area: %f\n", circle.Area())
} else if rectangle, ok := s.(Rectangle); ok {
fmt.Printf("Rectangle area: %f\n", rectangle.Area())
} else {
fmt.Println("Unsupported shape")
}
}
在上述代码中,PrintArea
函数接收一个 Shape
接口类型的参数。通过类型断言,判断传入的具体形状类型是 Circle
还是 Rectangle
,然后执行相应的面积计算逻辑。
- 获取接口值的底层具体类型方法
package main
import (
"fmt"
)
type Logger interface {
Log(message string)
}
type FileLogger struct {
FilePath string
}
func (fl FileLogger) Log(message string) {
fmt.Printf("Logging to file %s: %s\n", fl.FilePath, message)
}
type ConsoleLogger struct{}
func (cl ConsoleLogger) Log(message string) {
fmt.Printf("Logging to console: %s\n", message)
}
func DoLogging(l Logger) {
if fileLogger, ok := l.(*FileLogger); ok {
// 假设FileLogger有一个特殊方法,比如GetFilePath
filePath := fileLogger.FilePath
fmt.Printf("Logging to file %s\n", filePath)
}
l.Log("Some log message")
}
在这个例子中,DoLogging
函数接收一个 Logger
接口。通过类型断言,如果判断接口值是 FileLogger
类型,就可以获取其特有的属性(如 FilePath
)进行额外操作,然后再统一调用 Log
方法进行日志记录。