【Golang 面试题】每日 3 题(六十八)

发布于:2025-02-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

✍个人博客: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")
}

网站公告

今日签到

点亮在社区的每一天
去签到