当前位置: 首页 > news >正文

【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. 接口类型的嵌套:一个接口类型可以包含其他的接口类型作为它的一部分,这种方式称为接口的嵌套。嵌套接口会继承被嵌套接口的所有方法,并可以添加新的方法。嵌套接口的实现类必须实现所有嵌套接口的方法。

  2. 接口类型的扩展:一个接口类型可以通过添加新的方法来扩展另一个接口类型,这种方式称为接口的扩展。被扩展接口的实现类也必须实现新添加的方法。

  3. 接口类型的类型转换:可以将一个接口类型转换为另一个接口类型,前提是这两个接口类型都包含相同的方法集合。

  4. 接口类型的实现:一个接口类型可以被多个不同的类型实现,这些类型可以是基本类型、自定义类型或者其他接口类型。

需要注意的是,两个接口之间的关系并不是继承关系,而是通过包含相同的方法集合来建立联系。这意味着,一个接口类型并不会继承另一个接口类型的属性和方法。

嵌套和扩展的区别

扩展和嵌套是不同的概念。

接口类型的嵌套是将一个接口类型作为另一个接口类型的一部分,嵌套的接口类型可以继承被嵌套接口类型的所有方法,并可以添加新的方法。

接口类型的扩展是在一个接口类型的基础上新增方法,被扩展的接口类型的实现类也必须实现新添加的方法。

嵌套和扩展的区别在于,嵌套是将接口类型作为另一个接口类型的一部分,而扩展是在接口类型的基础上新增方法。嵌套是一种组合关系,扩展是一种继承关系。

实例演示

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 类型实现的。

同步锁的特点如下:

  1. 互斥性:同一时刻只能有一个 Goroutine 持有锁,其他 Goroutine 需要等待锁的释放才能获取锁。

  2. 阻塞性:如果一个 Goroutine 尝试获取一个已经被其他 Goroutine 持有的锁,它会被阻塞,直到锁被释放。

  3. 公平性:锁的获取是公平的,即锁会按照申请的先后顺序分配给等待的 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() 函数可以用于以下类型的数据:

  1. 数组:cap() 函数返回数组的长度,因为数组的长度在创建时就已经确定了。

  2. 切片:cap() 函数返回切片的容量,即切片底层数组的长度,它可能大于或等于切片的长度。切片容量的大小是在切片创建时自动分配的,也可以通过对切片使用 append() 函数来改变容量大小。

  3. Channel:cap() 函数返回 Channel 的容量,即 Channel 缓冲区的大小,只有在创建带缓冲的 Channel 时,才有意义。

注意:cap() 函数只能作用于包含指针的数据类型,如数组、切片和 Channel,而不能用于值类型的数据类型,如整型、浮点型等。

 10. Go Convey 是什么?一般用来做什么?

Go Convey 是一个基于 BDD(行为驱动开发)的测试框架,可以用于 Go 语言的单元测试和集成测试。它的主要特点是使用简单、易于阅读、易于编写和可扩展性强。

Go Convey 的主要用途是在编写测试时提供更好的可读性和可维护性,因为它可以将测试代码直接嵌入到源代码中,并在运行时自动生成测试报告。此外,它还提供了可视化界面来展示测试结果,可以帮助开发人员更直观地了解测试情况。

Go Convey 的使用非常简单,只需要在项目中导入相应的包并编写测试代码即可。它支持多种测试样式,包括表格测试、单元测试、集成测试等,还可以与其他测试框架集成使用,如 Go Test、Ginkgo 等。

相关文章:

【Golang 面试基础题】每日 5 题(二)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

状态模式与订单状态机的实现

状态模式 状态模式&#xff08;State Design Pattern&#xff09;是一种行为设计模式&#xff0c;用于在对象的内部状态改变时改变其行为。这种模式可以将状态的变化封装在状态对象中&#xff0c;使得对象在状态变化时不会影响到其他代码&#xff0c;提升了代码的灵活性和可维…...

【MSP430】MSP430是什么?与STM32对比哪个性能更佳?

一、MSP430是什么&#xff1f; MSP430F5529LP是一款由德州仪器&#xff08;TI&#xff09;推出的16位微控制器单元&#xff08;MCU&#xff09;开发板&#xff0c;具有USB功能&#xff0c;内存配置为128KB闪存和8KB RAM&#xff0c;工作频率高达25MHz。 这款MCU以其高性能和多…...

Win11 操作(四)g502鼠标连接电脑不亮灯无反应

罗技鼠标连接电脑不亮灯无反应 前言 罗技技术&#x1f4a9;中&#x1f4a9;&#xff0c;贴吧技术神中神&#xff01; 最近买了一个g502&#xff0c;结果买回来直接插上电脑连灯都不亮&#xff0c;问了一下客服。客服简单的让我换接口&#xff0c;又是下载ghub之类的&#xf…...

自定义QDialog使用详解

自定义QDialog使用详解 一、创建 QDialog 对象二、QDialog设置布局三、QDialog控制模态行为3.1 模态和非模态区别3.2 QDialog的模态使用四、使用 QDialogButtonBox五、处理对话框的结果六、使用 QDialog 的信号和槽QDialog是Qt框架中用于创建对话框窗口的基本类。对话框窗口通常…...

Pytorch使用教学2-Tensor的维度

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

Interesting bug caused by getattr

题意&#xff1a;由 getattr 引起的有趣的 bug 问题背景&#xff1a; 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. …...

获取后端返回的图形验证码

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

奇怪的Excel单元格字体颜色格式

使用VBA代码修改单元格全部字符字体颜色是个很简单的任务&#xff0c;例如设置A1单元格字体颜色为红色。 Range("A1").Font.Color RGB(255, 0, 0)有时需要修改部分字符的颜色&#xff0c;如下图所示&#xff0c;将红色字符字体颜色修改为蓝色。代码将会稍许复杂&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的数据&#xff0c; 操作 Object.assign(this.$data.queryForm, this.$options.data().queryForm); 就可以重置数据...

自学YOLO前置知识

YOLO前置知识 学习YOLO&#xff08;You Only Look Once&#xff09;之前&#xff0c;掌握一些前置知识会帮助你更好地理解和应用该技术。以下是一些推荐的前置知识领域&#xff1a; 计算机视觉基础&#xff1a; 图像处理&#xff1a;了解图像的基本处理技术&#xff0c;如滤波…...

Ubuntu18.04 编译报错: Could NOT find JNI

一、问题描述 Ubuntu18.04 编译报错 OpenCV 时&#xff0c;出现以下错误&#xff1a; Could NOT find JNI (missing: JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)二、解决方法 先执行以下指令&#xff0c; export JAVA_HOME/usr/lib/jvm/java-8-openjdk-am…...

SQL labs-SQL注入(五,使用sqlmap进行cookie注入)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web 页面时&#xff0c;在连接关闭后&#xff0c;服务端不会记录用户的信息。Cookie…...

C语言——内存管理

目录 前言 一、内存分类 1. 栈区&#xff08;Stack&#xff09; 2. 堆区&#xff08;Heap&#xff09; 3. 数据段&#xff08;Data Segment&#xff09; 4. 代码段&#xff08;Code Segment&#xff09; 二、内存分配方式 1、静态内存分配 2、栈内分配 3、动态内存分配 &#x…...

Unity UGUI 之 Image和Rawimage

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

Lua 语法学习笔记

Lua 语法学习笔记 安装(windows) 官网&#xff1a;https://www.lua.org/ 下载SDK 解压&修改名称&#xff08;去除版本号&#xff09; 将lua后面的版本号去掉&#xff0c;如lua54.exe->lua.ext 配置环境变量 数据类型 数据类型描述nil这个最简单&#xff0c;只有值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&#xff0c;接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2&#xff0c;实现接口 实现阿里支付 public class AliPagePay : IWe…...

Matlab 命令行窗口默认输出(异常)

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

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...

十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】

一、JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;具有以下核心特性&#xff1a; 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...