【Golang 面试题】每日 3 题(二十五)

devtools/2025/1/12 19:24:45/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

73. Channel 的 ring buffer 实现

在 Go 语言中,channel 是一种用于在 goroutine 之间进行通信的机制。通常情况下,channel 会被实现为一个 FIFO 的队列。当向 channel 发送数据时,数据会被添加到队列的末尾;当从 channel 接收数据时,数据会被从队列的头部取出。

在 Go 1.3 版本中,新增了一种基于环形缓冲区(ring buffer)的 channel 实现方式,可以用于提高 channel 的性能。具体来说,当创建一个缓冲区大小为 n 的 channel 时,Go 语言会为其分配一个大小为 n 的环形缓冲区,而不是一个简单的队列。
使用环形缓冲区实现 channel 有以下几个好处:

  1. 避免动态内存分配:在缓冲区大小确定的情况下,环形缓冲区可以在创建时一次性分配所需的内存,避免了频繁的动态内存分配和释放操作,从而提高了性能。
  2. 提高缓存命中率:环形缓冲区会将元素放置在连续的内存块中,这样可以提高缓存命中率,从而减少缓存访问延迟,提高了通信的效率。
  3. 支持无锁访问:由于 channel 是在多个 goroutine 之间进行通信的,因此通常会涉及到并发访问的问题。环形缓冲区的实现可以采用无锁算法,从而避免了锁竞争带来的开销,提高了并发访问的效率。

需要注意的是,使用环形缓冲区实现 channel 也有一些限制和注意事项。例如,缓冲区大小必须是 2 的幂次方,否则可能会导致缓冲区溢出或者浪费内存等问题。同时,对于特殊的 channel 操作,如 close、select 和带缓冲区的 channel 等,也需要注意环形缓冲区的使用方式。

在这里插入图片描述

74. Go 方法与函数的区别?

在 Go 语言中,方法(method)是一个包含接收者参数的函数,用于为接收者类型提供一些行为。而函数(function)则是一段代码,可被调用并可接收参数和返回值。

方法需要被绑定到一个类型上,它们通过使用接收者参数来实现这一点。接收者可以是值类型或指针类型。值类型的接收者在方法执行时会将调用者的值复制一份,而指针类型的接收者则直接操作调用者的值,因此可以修改调用者的状态。

与方法不同,函数没有接收者参数,因此它们无法直接修改调用者的状态。函数在 Go 语言中是一等公民,可以像任何其他类型的值一样被传递和赋值。函数还可以是匿名的,或者被作为闭包使用,以便在不同的作用域中进行操作。

75. Go 方法与函数实例

在 Go 语言中,函数是一段代码块,可以独立调用,接受参数和返回结果,它没有任何属于对象的概念。而方法是和对象相关联的函数,它属于对象的一部分,可以调用对象的属性和方法。

例如,下面是一个函数和一个方法的示例:

go">// 函数
func add(x int, y int) int {return x + y
}// 方法
type Person struct {Name stringAge  int
}func (p *Person) sayHello() {fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}

可以看到,函数 add 只是一个独立的代码块,而方法 sayHello 则是一个属于 Person 结构体对象的一部分。在调用方法时,需要先创建一个 Person 对象,然后通过这个对象调用方法,例如:

go">p := Person{Name: "Alice", Age: 30}
p.sayHello() // 输出:Hello, my name is Alice and I'm 30 years old.

总的来说,Go 语言中的方法与函数的区别在于方法需要绑定到一个类型上,并且可以直接修改调用者的状态,而函数则没有这些限制。


http://www.ppmy.cn/devtools/149950.html

相关文章

互斥信号量的等待与通知

目录 等待互斥信号量 信号量未被占用 信号量被自己占用 信号量被高优先级任务占用 信号量被低优先级任务占用 释放互斥信号量 未发生优先级继承 发生优先级继承 等待互斥信号量 信号量未被占用 标记为已经被占用锁定计数1 信号量被自己占用 锁定计数1 信号量被高优先级任务占用…

基于Linux环境的进度条实现

文章目录 前言📚一、预备知识📖1.1 回车换行📖1.2 缓冲区 📚二、倒计时📖2.1 源代码📖2.2 效果展示📖2.3 注意事项: 📚三、进度条📖3.1 源代码📓p…

微信小程序中使用weui组件库

这里只介绍官方推荐的通过useExtendedLib扩展库的方式引入,这种方式引入的组件将不计入代码包的大小。 app.json中配置 {"useExtendedLib": {"kbone": true,"weui": true} }在使用组件的页面的 json 文件加入 usingComponents 配置字…

jmeter使用说明

一、新建一个测试计划 二、右键测试计划,添加线程组 三、配置线程组 0、配置请求前预处理程序 可以进行参数加签加密等操作。(有需求请求参数需要加密加签等操作的可以配置,无需求的可以不配置) 添加BeanShell预处理程序 ${__P(…

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC 原生扩展简介 如果你用过 Node.js,应该知道它强大的地方在于能处理各种场景,速度还很快。但你有没有想过,Node.js 的速度秘密是什么?今天我们来聊聊其中一个幕后英雄——原生扩展…

C++ STL map和set的使用

序列式容器和关联式容器 想必大家已经接触过一些容器如:list,vector,deque,array,forward_list,string等,这些容器统称为系列容器。因为逻辑结构为线性的,两个位置的存储的值一般是…

【Oracle篇】深入了解执行计划中的访问路径(含表级别、B树索引、位图索引、簇表四大类访问路径)

💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…

1.微服务

商城项目源码地址 https://gitee.com/huyi612/hmall 使用jmeter测试高并发 传统单体项目的弊端 案例:如果某一个请求耗时太长会把tomcat的资源给占完了,导致其他请求进来耗时更长,甚至无法进入。 RestController RequestMapping("h…