面试题答案
一键面试- 接口的动态类型和静态类型:
- 静态类型:接口变量本身的类型,在声明接口变量时确定。例如
var i interface{}
,这里接口变量i
的静态类型就是interface{}
。 - 动态类型:接口变量实际存储的值的类型。例如
var i interface{}; s := "hello"; i = s
,此时接口变量i
的动态类型是string
。
- 静态类型:接口变量本身的类型,在声明接口变量时确定。例如
- 获取接口的动态类型和静态类型:
- 获取动态类型:可以使用
reflect.TypeOf
函数。示例代码如下:
- 获取动态类型:可以使用
package main
import (
"fmt"
"reflect"
)
func main() {
var i interface{}
s := "hello"
i = s
dynamicType := reflect.TypeOf(i)
fmt.Printf("动态类型: %v\n", dynamicType)
}
- 获取静态类型:接口变量声明时的类型就是静态类型,无需额外获取。如上面代码中
i
的静态类型就是interface{}
。
- 在类型断言和类型切换中的作用:
- 类型断言:语法为
x.(T)
,其中x
是接口类型变量,T
是目标类型。类型断言用于从接口变量中提取动态类型的值。例如:
- 类型断言:语法为
package main
import (
"fmt"
)
func main() {
var i interface{}
s := "hello"
i = s
if str, ok := i.(string); ok {
fmt.Printf("断言成功,值为: %v\n", str)
} else {
fmt.Println("断言失败")
}
}
这里 i
的静态类型是 interface{}
,动态类型是 string
,通过类型断言可以将 i
中存储的 string
类型值提取出来。如果 i
的动态类型不是 string
,断言就会失败。
- 类型切换:语法为
switch v := x.(type)
,x
是接口类型变量。类型切换用于根据接口变量的动态类型执行不同的代码块。例如:
package main
import (
"fmt"
)
func main() {
var i interface{}
i = 10
switch v := i.(type) {
case int:
fmt.Printf("动态类型是 int,值为: %v\n", v)
case string:
fmt.Printf("动态类型是 string,值为: %v\n", v)
default:
fmt.Println("其他类型")
}
}
在类型切换中,根据接口变量 i
的动态类型,执行相应的 case
分支代码。静态类型确定了接口变量可以进行类型断言和类型切换操作,而动态类型决定了实际执行哪个分支。