【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值&…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
