✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
202. 接口和结构体的关系
接口定义行为规范:Go 语言中的接口是一组方法签名的集合,它定义了对象的行为规范,不关心具体实现。
结构体实现接口:结构体可以实现一个或多个接口,通过实现接口中定义的所有方法,表明该结构体具备接口所规定的行为。
多态实现:一个接口类型的变量可以指向实现该接口的任意结构体实例,从而实现多态。比如:
package main
import "fmt"
type Shape interface {
Area() float64
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func main() {
var s Shape
s = Rectangle{Width: 5, Height: 3}
fmt.Printf("Rectangle area: %f\n", s.Area())
s = Circle{Radius: 4}
fmt.Printf("Circle area: %f\n", s.Area())
}
203. 内存分配机制
栈内存:Go 语言中,局部变量、函数参数等通常分配在栈上,栈的分配和释放由编译器自动管理,速度快,但栈大小有限。
堆内存:通过new和make关键字创建的对象,如切片、map、结构体指针等,会分配在堆上。堆内存的管理由 Go 的垃圾回收器(GC)负责,其分配灵活但开销相对较大。
逃逸分析:编译器通过逃逸分析决定变量是在栈上还是堆上分配。若变量的生命周期超出函数范围或无法在编译期确定大小等情况,就会发生逃逸,被分配到堆上。
204. defer 关键字
作用:defer用于延迟执行函数调用,在函数执行结束时,按照先进后出(FILO)的顺序执行被defer的函数。常用于资源清理,如关闭文件句柄、释放数据库连接等。
执行时机:defer语句在遇到时,会将其后面的函数调用入栈,等到外围函数执行完毕,无论是正常返回还是发生错误,都会依次执行栈中的defer函数。
示例:
package main
import "fmt"
func main() {
fmt.Println("Start")
defer fmt.Println("Defer 1")
defer fmt.Println("Defer 2")
fmt.Println("End")
}