面试题答案
一键面试初始化
- 初始化方式:在实现接口方法时,对于未命名类型的切片,需正确初始化。可以使用
make
函数来初始化切片,指定切片的长度和容量(可选),例如mySlice := make([]ElementType, 0, 10)
,其中ElementType
是切片中元素的类型。也可以通过字面量初始化,如mySlice := []ElementType{element1, element2}
。 - 注意事项:如果未初始化就使用切片,会导致运行时错误。例如以下代码会报错:
package main
import "fmt"
type MyInterface interface {
DoSomething([]int)
}
type MyStruct struct{}
func (m MyStruct) DoSomething(slice []int) {
fmt.Println(len(slice)) // 这里如果slice未初始化就会报错
}
func main() {
var myObj MyInterface = MyStruct{}
var mySlice []int
myObj.DoSomething(mySlice) // 这里mySlice未初始化
}
避免方法:在调用接口方法传递切片前,确保切片已初始化。
赋值
- 赋值规则:切片赋值时要注意类型一致性。因为是未命名类型切片,只要元素类型相同,不同长度和容量的切片间可以相互赋值。例如:
package main
import "fmt"
type MyInterface interface {
DoSomething([]int)
}
type MyStruct struct{}
func (m MyStruct) DoSomething(slice []int) {
newSlice := make([]int, len(slice))
copy(newSlice, slice) // 这里将传入的切片赋值到新切片
fmt.Println(newSlice)
}
func main() {
var myObj MyInterface = MyStruct{}
mySlice := []int{1, 2, 3}
myObj.DoSomething(mySlice)
}
- 注意事项:如果尝试将不同元素类型的切片赋值,会导致编译错误。例如:
package main
import "fmt"
type MyInterface interface {
DoSomething([]int)
}
type MyStruct struct{}
func (m MyStruct) DoSomething(slice []int) {
fmt.Println(slice)
}
func main() {
var myObj MyInterface = MyStruct{}
var wrongSlice []string = []string{"a", "b"}
myObj.DoSomething(wrongSlice) // 这里类型不匹配,编译会报错
}
避免方法:确保赋值的切片元素类型与接口方法参数切片的元素类型一致。
类型断言
- 类型断言使用:在某些情况下,可能需要在实现接口方法内部对传入的切片进行类型断言,例如在接口实现中需要处理不同类型的切片。但对于未命名类型切片,类型断言的目标类型必须精确匹配切片元素类型。例如:
package main
import "fmt"
type MyInterface interface {
DoSomething(interface{})
}
type MyStruct struct{}
func (m MyStruct) DoSomething(data interface{}) {
if slice, ok := data.([]int); ok {
fmt.Println(slice)
} else {
fmt.Println("Not a slice of int")
}
}
func main() {
var myObj MyInterface = MyStruct{}
mySlice := []int{1, 2, 3}
myObj.DoSomething(mySlice)
}
- 注意事项:如果类型断言的目标类型与实际切片元素类型不匹配,会导致类型断言失败。例如:
package main
import "fmt"
type MyInterface interface {
DoSomething(interface{})
}
type MyStruct struct{}
func (m MyStruct) DoSomething(data interface{}) {
if slice, ok := data.([]string); ok {
fmt.Println(slice)
} else {
fmt.Println("Not a slice of string")
}
}
func main() {
var myObj MyInterface = MyStruct{}
mySlice := []int{1, 2, 3}
myObj.DoSomething(mySlice) // 这里类型断言失败
}
避免方法:在进行类型断言前,确保目标类型与实际切片元素类型一致,或者使用类型开关来安全地处理多种可能的类型。