【Golang 面试基础题】每日 5 题(二)
✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
6. 如何在运行时检查变量类型?
在 Go 语言中,可以使用反射(reflection)机制来在运行时检查变量的类型。反射是一种在程序运行时检查变量类型、值的机制,可以在不知道具体类型的情况下操作对象。
Go 语言中的反射主要依赖于 reflect 包提供的函数和类型。通过 reflect 包中的 TypeOf 和 ValueOf 函数,可以获取一个变量的类型和值,从而进行相关操作。以下是一个简单的示例代码:
package mainimport ("fmt""reflect"
)func main() {var x interface{}x = 42t := reflect.TypeOf(x)v := reflect.ValueOf(x)fmt.Printf("Type: %v\n", t)fmt.Printf("Value: %v\n", v)
}
在上面的示例代码中,我们定义了一个接口变量 x,并将其赋值为 42。接着,使用 reflect.TypeOf 和 reflect.ValueOf 函数获取了变量 x 的类型和值,并分别打印输出。
需要注意的是,反射机制的使用可能会带来一定的性能损失,因此应该尽量避免过度使用反射。在编写代码时,应该尽可能地使用静态类型检查,避免在运行时进行类型检查和转换。
7. Go 两个接口之间可以存在什么关系?
在 Go 语言中,接口是一种类型,可以被用作变量类型、函数参数或返回值的类型。Go 语言中的接口类型是基于所包含的方法签名来定义的,两个接口之间可以存在以下几种关系:
-
接口类型的嵌套:一个接口类型可以包含其他的接口类型作为它的一部分,这种方式称为接口的嵌套。嵌套接口会继承被嵌套接口的所有方法,并可以添加新的方法。嵌套接口的实现类必须实现所有嵌套接口的方法。
-
接口类型的扩展:一个接口类型可以通过添加新的方法来扩展另一个接口类型,这种方式称为接口的扩展。被扩展接口的实现类也必须实现新添加的方法。
-
接口类型的类型转换:可以将一个接口类型转换为另一个接口类型,前提是这两个接口类型都包含相同的方法集合。
-
接口类型的实现:一个接口类型可以被多个不同的类型实现,这些类型可以是基本类型、自定义类型或者其他接口类型。
需要注意的是,两个接口之间的关系并不是继承关系,而是通过包含相同的方法集合来建立联系。这意味着,一个接口类型并不会继承另一个接口类型的属性和方法。
嵌套和扩展的区别
扩展和嵌套是不同的概念。
接口类型的嵌套是将一个接口类型作为另一个接口类型的一部分,嵌套的接口类型可以继承被嵌套接口类型的所有方法,并可以添加新的方法。
接口类型的扩展是在一个接口类型的基础上新增方法,被扩展的接口类型的实现类也必须实现新添加的方法。
嵌套和扩展的区别在于,嵌套是将接口类型作为另一个接口类型的一部分,而扩展是在接口类型的基础上新增方法。嵌套是一种组合关系,扩展是一种继承关系。
实例演示
1、接口类型的嵌套:假设有两个接口类型 A 和 B,其中 B 嵌套了 A。A 定义了一个方法 DoSomething(),B 新增了一个方法 DoSomethingElse()。那么实现 B 接口的类必须实现 A 接口中的 DoSomething() 方法和 B 接口中的 DoSomethingElse() 方法。
type A interface {DoSomething()
}type B interface {A // A是B的一部分DoSomethingElse()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func (mc *MyClass) DoSomethingElse() {fmt.Println("Do something else.")
}func main() {var b B = &MyClass{}b.DoSomething()b.DoSomethingElse()
}
2、接口类型的扩展:假设有两个接口类型 A 和 B,其中 A 定义了一个方法 DoSomething(),B 通过扩展 A 接口新增了一个方法 DoSomethingElse()。那么实现 B 接口的类必须实现 A 和 B 接口中的所有方法。
type A interface {DoSomething()
}type B interface {A // 扩展A接口DoSomethingElse()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func (mc *MyClass) DoSomethingElse() {fmt.Println("Do something else.")
}func main() {var b B = &MyClass{}b.DoSomething()b.DoSomethingElse()
}
3、接口类型的类型转换:假设有两个接口类型 A 和 B,其中 A 和 B 都定义了方法 DoSomething()。那么可以将 A 类型的变量转换为 BB类型的变量,前提是 A 和 B 包含相同的方法集合。
type A interface {DoSomething()
}type B interface {DoSomething()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func main() {var a A = &MyClass{}var b B = a.(B) // 类型转换b.DoSomething()
}
4、接口类型的实现:假设有一个接口类型 A,它定义了一个方法 DoSomething()。那么可以有多个类型实现 A 接口,只要这些类型实现了 A 接口中定义的所有方法。
type A interface {DoSomething()
}type MyClass1 struct {}func (mc *MyClass1) DoSomething() {fmt.Println("Do something in MyClass1.")
}type MyClass2 struct {}func (mc *MyClass2) DoSomething() {fmt.Println("Do something in MyClass2.")
}func main() {var a A = &MyClass1{}a.DoSomething()a = &MyClass2{}a.DoSomething()
}
8. Go 当中同步锁有什么特点?作用是什么?
在 Go 语言中,同步锁是一种常用的并发编程技术,用于保证多个 Goroutine 之间的共享数据的安全访问。Go 语言中的同步锁是通过 sync 包提供的 Mutex 类型实现的。
同步锁的特点如下:
-
互斥性:同一时刻只能有一个 Goroutine 持有锁,其他 Goroutine 需要等待锁的释放才能获取锁。
-
阻塞性:如果一个 Goroutine 尝试获取一个已经被其他 Goroutine 持有的锁,它会被阻塞,直到锁被释放。
-
公平性:锁的获取是公平的,即锁会按照申请的先后顺序分配给等待的 Goroutine,避免某些 Goroutine 永远无法获取锁的情况。
同步锁的作用是保护共享数据,避免多个 Goroutine 同时对共享数据进行修改而导致的竞争条件和数据竞争问题。在需要保证共享数据的安全访问时,可以使用同步锁来对临界区进行加锁,以避免并发修改数据产生的问题。在使用同步锁时,需要注意避免死锁和饥饿等问题的发生,同时需要合理地设计锁的粒度和作用域,避免锁的竞争导致性能下降。
实例
假设有一个全局变量 counter,多个 Goroutine 都要对其进行修改,为了保证对其安全访问,可以使用同步锁来实现:
import ("fmt""sync"
)var counter int
var mutex sync.Mutexfunc increment() {mutex.Lock() // 获取锁counter = counter + 1 // 修改共享变量mutex.Unlock() // 释放锁
}func main() {var wg sync.WaitGroupfor i := 0; i < 100; i++ {wg.Add(1)go func() {defer wg.Done()increment() // 调用共享变量修改函数}()}wg.Wait()fmt.Println("Counter:", counter)
}
9. Go 语言中 cap 函数可以作用于哪些内容?
在 Go 语言中,cap() 函数可以用于以下类型的数据:
-
数组:cap() 函数返回数组的长度,因为数组的长度在创建时就已经确定了。
-
切片:cap() 函数返回切片的容量,即切片底层数组的长度,它可能大于或等于切片的长度。切片容量的大小是在切片创建时自动分配的,也可以通过对切片使用 append() 函数来改变容量大小。
-
Channel:cap() 函数返回 Channel 的容量,即 Channel 缓冲区的大小,只有在创建带缓冲的 Channel 时,才有意义。
注意:cap() 函数只能作用于包含指针的数据类型,如数组、切片和 Channel,而不能用于值类型的数据类型,如整型、浮点型等。
10. Go Convey 是什么?一般用来做什么?
Go Convey 是一个基于 BDD(行为驱动开发)的测试框架,可以用于 Go 语言的单元测试和集成测试。它的主要特点是使用简单、易于阅读、易于编写和可扩展性强。
Go Convey 的主要用途是在编写测试时提供更好的可读性和可维护性,因为它可以将测试代码直接嵌入到源代码中,并在运行时自动生成测试报告。此外,它还提供了可视化界面来展示测试结果,可以帮助开发人员更直观地了解测试情况。
Go Convey 的使用非常简单,只需要在项目中导入相应的包并编写测试代码即可。它支持多种测试样式,包括表格测试、单元测试、集成测试等,还可以与其他测试框架集成使用,如 Go Test、Ginkgo 等。
相关文章:
【Golang 面试基础题】每日 5 题(二)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
状态模式与订单状态机的实现
状态模式 状态模式(State Design Pattern)是一种行为设计模式,用于在对象的内部状态改变时改变其行为。这种模式可以将状态的变化封装在状态对象中,使得对象在状态变化时不会影响到其他代码,提升了代码的灵活性和可维…...
【MSP430】MSP430是什么?与STM32对比哪个性能更佳?
一、MSP430是什么? MSP430F5529LP是一款由德州仪器(TI)推出的16位微控制器单元(MCU)开发板,具有USB功能,内存配置为128KB闪存和8KB RAM,工作频率高达25MHz。 这款MCU以其高性能和多…...

Win11 操作(四)g502鼠标连接电脑不亮灯无反应
罗技鼠标连接电脑不亮灯无反应 前言 罗技技术💩中💩,贴吧技术神中神! 最近买了一个g502,结果买回来直接插上电脑连灯都不亮,问了一下客服。客服简单的让我换接口,又是下载ghub之类的…...
自定义QDialog使用详解
自定义QDialog使用详解 一、创建 QDialog 对象二、QDialog设置布局三、QDialog控制模态行为3.1 模态和非模态区别3.2 QDialog的模态使用四、使用 QDialogButtonBox五、处理对话框的结果六、使用 QDialog 的信号和槽QDialog是Qt框架中用于创建对话框窗口的基本类。对话框窗口通常…...

Pytorch使用教学2-Tensor的维度
在PyTorch使用的过程中,维度转换一定少不了。而PyTorch中有多种维度形变的方法,我们该在什么场景下使用什么方法呢? 本小节我们使用的张量如下: # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …...

Interesting bug caused by getattr
题意:由 getattr 引起的有趣的 bug 问题背景: I try to train 8 CNN models with the same structures simultaneously. After training a model on a batch, I need to synchronize the weights of the feature extraction layers in other 7 models. …...

获取后端返回的图形验证码
如果后端返回的直接就是一个图形,有以下几种方式展示 一、直接在img标签里面的src里面调用接口 <img :src"dialogSrc" class"photo" alt"验证码图片" click"changeDialog">let orgUrl "/api/captcha" …...

奇怪的Excel单元格字体颜色格式
使用VBA代码修改单元格全部字符字体颜色是个很简单的任务,例如设置A1单元格字体颜色为红色。 Range("A1").Font.Color RGB(255, 0, 0)有时需要修改部分字符的颜色,如下图所示,将红色字符字体颜色修改为蓝色。代码将会稍许复杂&am…...

浅谈芯片验证中的仿真运行之 timescale (五)提防陷阱
一 仿真单位 timeunit 我们知道,当我们的代码中写清楚延时语句时,若不指定时间单位,则使用此单位; 例如: `timescale 1ns/1ps 则 #15 语句表示delay15ns; 例:如下代码,module a 的timescale是1ns/1ps, module b 是1ps/1ps; module b中的clk,频率是由输入参…...
uniapp 重置表单数据
场景 例如有数据如下 data(){return {queryForm:{value1:undefined,}} } 点击重置时候想重置form的数据, 操作 Object.assign(this.$data.queryForm, this.$options.data().queryForm); 就可以重置数据...
自学YOLO前置知识
YOLO前置知识 学习YOLO(You Only Look Once)之前,掌握一些前置知识会帮助你更好地理解和应用该技术。以下是一些推荐的前置知识领域: 计算机视觉基础: 图像处理:了解图像的基本处理技术,如滤波…...
Ubuntu18.04 编译报错: Could NOT find JNI
一、问题描述 Ubuntu18.04 编译报错 OpenCV 时,出现以下错误: Could NOT find JNI (missing: JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)二、解决方法 先执行以下指令, export JAVA_HOME/usr/lib/jvm/java-8-openjdk-am…...

SQL labs-SQL注入(五,使用sqlmap进行cookie注入)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言: Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。Cookie…...
C语言——内存管理
目录 前言 一、内存分类 1. 栈区(Stack) 2. 堆区(Heap) 3. 数据段(Data Segment) 4. 代码段(Code Segment) 二、内存分配方式 1、静态内存分配 2、栈内分配 3、动态内存分配 &#x…...

Unity UGUI 之 Image和Rawimage
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Image是什么 Unity - 手册:图像 精灵格式是什么? 1.2重要参数 …...

Lua 语法学习笔记
Lua 语法学习笔记 安装(windows) 官网:https://www.lua.org/ 下载SDK 解压&修改名称(去除版本号) 将lua后面的版本号去掉,如lua54.exe->lua.ext 配置环境变量 数据类型 数据类型描述nil这个最简单,只有值n…...

Prometheus配置alertmanager告警
1、拉取镜像并运行 1、配置docker镜像源 [rootlocalhost ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://dfaad.mirror.aliyuncs.com"] } [rootlocalhost ~]# systemctl daemon-reload [rootlocalhost ~]# systemctl restart docker2、…...
.net core 外观者设计模式 实现,多种支付选择
1,接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2,实现接口 实现阿里支付 public class AliPagePay : IWe…...

Matlab 命令行窗口默认输出(异常)
目录 前言Matlab 先验知识1 异常输出的代码2 正常输出的代码 前言 在单独调试 Matlab 写的函数时出现不想出现的异常打印值,逐个注释排查才找到是 if elseif else 代码块的问题,会默认打印输出 else 部分第一个返回值的值(下方代码中的 P值&…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...