【213】go语言问的比较多的面试题

本文详细介绍了Go语言中的数据类型,包括基本类型、复合类型如切片、数组、字典和结构体,以及管道类型。强调了函数与方法的区别,特别是方法值接收者和指针接收者的影响。还讨论了内存管理,如new和make的区别,以及内存逃逸现象。最后,阐述了channel的底层原理及其在并发中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go语言的数据类型

常规的都是布尔型 字符串 数字类型,下面提到的有函数类型和方法类型。 需要单独记忆的就是这个接口类型和指针类型。
比较重要的是复合类型:
复合类型比较常见的是切片和数组,
不太熟悉的是字典和结构化类型,
最不熟悉但是应该比较重要的就是管道类型。

方法和函数的区别

go语言中函数和方法是两个概念,函数是指不属于任何结构体、类型的方法,也就是说函数是没有接收者的;而方法是有接收者的。

new 和make的区别

go语言类型分为值类型和引用类型。
值类型包括,ifsbsa
int float string bool struct array
他们直接存储值,分配栈的内存空间,它们被函数调用完之后会释放。

引用类型包括
什么车 smc
slice map chan
他们存储的是一个地址,可以理解为指针,指针指向内存中真正存储数据的首地址,内存通常在堆分配,通过gc回收。

区别

new 的参数要求传入一个类型,而不是一个值,它会申请该类型的内存大小空间,并初始化为对应的零值,返回该指向类型空间的一个指针

make 也用于内存分配,但它只用于引用对象 slice、map、channel的内存创建,返回的类型是类型本身

函数返回局部变量的指针是否安全

一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
但这在 Go 中是安全的,Go 编译器将会对每个局部变量进行逃逸分析。如果发现局部变量的作用域超出该函数,则不会将内存分配在栈上,而是分配在堆上,因为他们不在栈区,即使释放函数,其内容也不会受影响。

什么叫内存逃逸

首先go的变量要不在栈上要不在堆上,栈上的变量会在函数销毁的时候就释放了,堆上的就要靠gc算法来了,我们一般说从栈逃逸到堆上或者一开始直接就在堆上的变量内存叫做内存逃逸

什么时候会内存逃逸

引起内存逃逸的关键就是,编译器在编译的时候无法确定确定变量的生命周期,只能在运行时控制了

函数返回了局部变量的指针
发送指针或者带有指针的数据进channel
在切片上存储指针或带有指针的值
切片扩容
调用interface的方法(fmt.println)
堆上动态分配内存比栈上静态分配内存,开销大很多。
变量分配在栈上需要能在编译期确定它的作用域,否则会分配到堆上。
Go编译器会在编译期对考察变量的作用域,并作一系列检查,如果它的作用域在运行期间对编译器一直是可知的,那么就会分配到栈上。简单来说,编译器会根据变量是否被外部引用来决定是否逃逸。
对于Go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags '-m’命令来观察变量逃逸情况就行了。
不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。

尽量写出少一些逃逸的代码,提升程序的运行效率。

go语言中方法与函数的区别

在Go语言中,函数和方法不太一样,有明确的概念区分;函数是指不属于任何结构体、类型的方法,也就是说函数是没有接收者的;而方法是有接收者的。

go语言中方法值接收者和指针接收者的区别

如果方法的接收者是指针类型,无论调用者是对象还是对象指针,修改的都是对象本身,会影响调用者;
如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者;

channel的底层实现原理

Go中的channel 是一个队列,遵循先进先出的原则,负责协程之间的通信(Go 语言提倡不要通过共享内存来通信,而要通过通信来实现内存共享,CSP(Communicating Sequential Process)并发模型,就是通过 goroutine 和 channel 来实现的)
通过var声明或者make函数创建的channel变量是一个存储在函数栈帧上的指针,占用8个字节,指向堆上的hchan结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值