每日八股文6.1

news2025/6/4 9:30:02

每日八股-6.1

  • Go
    • 1.Sync.map的底层实现
    • 2.结构体的tag如何获取?
    • 3.Go实现单例模式(使用sync.Once)
    • 4.Go实现单例模式(不使用sync.Once)
    • 5.make和new的区别
    • 6.Go项目引用包为什么用_以及包的init()函数
    • 7.如何判断一个结构体是否实现了某接口?
    • 8.空interface{}和interface的底层数据结构
    • 9.不同结构体或者不同切片怎么进行比较

Go

1.Sync.map的底层实现

Sync.map有别于普通map的区别就是它可以实现map的线程安全,即多个goroutine同时对map进行操作时,不会造成不可预测的后果。

Sync.map共有四个字段,第一个为mutex,第二个为read,第三个为dirty,第四个为misses。

mutex即为互斥锁;read字段用来存放当前map的内容,当要读取map的内容时,都是先读取read字段里面的值,在读取dirty里面的内容;dirty字段用于往map里面写数据用,写的数据会暂时存放在dirty中;读read不需要加锁,而读或写dirty都需要加锁;misses用来统计有多少次需要去读dirty里面的数据,当超过一定次数后,会把dirty里面的数据合并到read中。

type Map struct {
    // 加锁作用,保护 dirty 字段
    mu Mutex
    // 只读的数据,实际数据类型为 readOnly
    read atomic.Value
    // 最新写入的数据
    dirty map[interface{}]*entry
    // 计数器,每次需要读 dirty 则 +1
    misses int
}

2.结构体的tag如何获取?

通过反射reflect.typeof().field().Tag.Get()获取,可参考下面的代码

func main() {
        type S struct {
                F string `species:"gopher" color:"blue"`  
        }
        s := S{}
        st := reflect.TypeOf(s)
        field := st.Field(0)
        fmt.Println(field.Tag.Get("color"), field.Tag.Get("species")) // blue gopher
}

3.Go实现单例模式(使用sync.Once)

首先说明什么是单例模式,单例模式即一个类只能有一个实例,且可以通过一个全局访问点去访问。单例模式常用于配置管理(应用程序可能需要一个只初始化一次的配置管理器)以及日志记录(日志记录器通常只需要一个实例,以避免日志信息的混乱)。

使用sync.Once.Do(func())实现单例模式的代码如下

package singleton
import (
    "sync"
)
type singleton struct {}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

4.Go实现单例模式(不使用sync.Once)

可以通过互斥锁来实现单例模式,但是这样做不如用sync.Once,因为我们无论做什么操作,即使现在这个实例已经被创建了,我们调用该函数的时候首先还是要加锁,会造成不必要的资源浪费,因为加锁和解锁都是有开销的。

var mu Sync.Mutex
func GetInstance() *singleton {
    mu.Lock()                    // 如果实例存在没有必要加锁
    defer mu.Unlock()
    if instance == nil {
        instance = &singleton{}
    }
    return instance
}

5.make和new的区别

make用于slice、map、channel的声明及初始化,new可以对任何数据类型进行声明;使用make不光分配内存空间,还会初始化内存空间;而使用new只会分配内存空间,如果不初始化,那么他就指向nil;make返回的是数据类型本身,而new返回的是指向该数据类型的指针。

6.Go项目引用包为什么用_以及包的init()函数

在go程序开始执行时,做的第一件事就是执行各个引入包的init()函数,init()函数无法被主动调用,只能是go运行时系统自动执行。如果我们只需要引入包而不需要包里面的其他函数以及变量,我们就需要在引入时用_注释,这样go编译器就不会提示我们包引入却未被调用。

7.如何判断一个结构体是否实现了某接口?

通过反射reflect.typeof().Implements()来实现,可看下面的代码具体实现

type SayHello interface {
        Hello()
}
type Person struct {
        Name string
}
func (p *Person) Hello() {
        fmt.Printf("Hello, %s!
", p.Name)
}
func main() {
        p := &Person{}
        rv := reflect.TypeOf(p)
        //Implements里面的内容也可以替换为var iface SayHello,reflect.TypeOf(&iface).Elem()
        if rv.Implements(reflect.TypeOf((*SayHello)(nil)).Elem()) {  //这种方式避免了显式声明一个接口变量
                fmt.Println("实现了SayHello接口")
        }
}

8.空interface{}和interface的底层数据结构

空接口,即 interface{},可以存储任何类型的值。这是因为它没有定义任何方法。为了实现这种灵活性,它的运行时表示 (eface) 需要存储两部分信息_type和data

非空接口(例如 io.Reader、fmt.Stringer)定义了一组方法,任何具体类型都必须实现这些方法才能满足该接口。tab *itab这个字段是一个指向 itab(接口表)struct 的指针。itab 对于处理接口值上的方法调用至关重要。它存储了:

  1. 指向具体值的 _type。
  2. 指向接口本身的 _type(接口类型描述符)。
  3. 一个函数指针列表(方法表),用于指向该接口定义的方法,具体指向当前接口持有的具体类型对这些方法的实现
//空接口
type eface struct {
        _type *_type         //接口内部存储的具体数据的真实类型
        data  unsafe.Pointer //data是指向真实数据的指针
}
//非空接口
type iface struct {
        tab  *itab
        data unsafe.Pointer //data是指向真实数据的指针
}

9.不同结构体或者不同切片怎么进行比较

使用反射reflect.DeepEqual()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu】摸鱼技巧之虚拟机环境复制

前言 提示:所有的操作都需要关闭虚拟机 如何快速在其它电脑布置,linux环境,如果我们有一个环境直接拷贝就有时间摸鱼呀。 1.直接复制简单粗暴 不做赘述,如果不会复制,那么请右击鼠标压缩复制 2.克隆虚拟机 2.1 …

室内VR全景助力房产营销及装修

在当今的地产行业,VR全景已成为不可或缺的应用工具。从地产直播到楼市VR地图,从效果图到水电家装施工记录,整个地产行业的上下游生态中,云VR全景的身影无处不在。本文将探讨VR全景在房产营销及装修领域的应用,并介绍众…

jenkins集成gitlab实现自动构建

jenkins集成gitlab实现自动构建 前面我们已经部署了Jenkins和gitlab,本文介绍将二者结合使用 项目源码上传至gitee提供公网访问:https://gitee.com/ye-xiao-tian/my-webapp 1、创建一个群组和项目 2、添加ssh密钥 #生成密钥 [rootgitlab ~]# ssh-keyge…

Spring Boot微服务架构(八):开发之初就引入APM工具监控

使用 APM(Application Performance Management)工具监控 Spring Boot 应用,可以帮助开发者实时追踪性能瓶颈、分析调用链路、监控资源使用情况,并快速定位故障。以下是详细的步骤和常用工具的选择指南: ​​一、常用 A…

大规模真实场景 WiFi 感知基准数据集

一段话总结 本文提出CSI-Bench,首个大规模真实场景WiFi感知基准数据集,覆盖26个室内环境、35名用户、16种商用设备,包含461小时有效数据,支持跌倒检测、呼吸监测、定位、运动源识别等单任务及用户身份、活动、 proximity联合标注的多任务学习。通过标准化评估协议和基线模…

Python实现HPSO-TVAC优化算法优化支持向量机SVC分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代,支持向量机(SVM)作为一种经典的机器学习算法,…

ck-editor5的研究 (3):初步使用 CKEditor5 的事件系统和API

前言 在上一篇文章中—— ck-editor5的研究(2):对 CKEditor5 进行设计,并封装成一个可用的 vue 组件 ,我已经把 CKEditor5 封装成了一个通用vue组件,并且成功在nuxt中运行,并具备一定的通用性&…

WPS快速排版

论文包括(按顺序):封面(含题目)、摘 要、关键词、Abstract(英文摘要)、Keywords、目录、正文、参考文献、在读期间发表的学术论文及研究成果,致 谢 题目(黑小一加粗&…

Java实现命令行图书管理系统(附完整源码)

一、项目概述 本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员和普通用户两种角色,提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则,代码结构清晰,适合Java初学者学习。 二、系统功能架构 graph T…

【数据结构】顺序表和链表详解(上)

前言:上期我们介绍了算法的复杂度,知道的算法的重要性同时也了解到了评判一个算法的好与坏就去看他的复杂度(主要看时间复杂度),这一期我们就从顺序表和链表开始讲起。 文章目录 一,顺序表1,线性表2,顺序表…

唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!

在智能家居的浪潮中,门锁搭载显示屏已成为行业创新的焦点。据行业数据显示,2023年全球智能门锁出货量中,搭载显示屏的型号占比已突破40%,且年复合增长率达25%。而2024年国内智能门锁销量突破2200万套,预计2025年市场规…

智能穿戴新标杆:SD NAND (贴片式SD卡)与 SOC 如何定义 AI 眼镜未来技术路径

目录 一、SD NAND:智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片:AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC:11>2的协同效应数据流水线的高效协同端侧…

node_modules包下载不下来

如果项目里面的package-lock.json有resolved ,就指向了包的下载来源,如果这个网址挂了,那npm i 就会一直卡着。而且,在终端去修改 npm的镜像是没有用的 解决办法是:把项目里面的 lock文件 .npmrc都删了 然后重新下载就可以了

yolo个人深入理解

卷积层的理解,通过云端服务器训练模型,模型构建的重要性,针对极低像素的处理,模型训练召回率提高技巧,卷积层2,4,8,16,32的小模型与大模型的理解 一.关于backbone,neck,head深入理解 1,backbone的主要组成部分是sppf和conv,这是backbone的核心,其中yolov5和yolov8…

从0开始学vue:Element Plus详解

一、核心架构解析二、技术实现指南三、高级特性实现四、性能优化方案五、生态扩展方案六、调试与测试七、版本演进路线 Element Plus 是专为 Vue 3 设计的桌面端 UI 组件库,基于 Vue 3 的 Composition API 重构,在保持与 Element UI 兼容性的同时&#x…

互联网向左,区块链向右

2008年,中本聪首次提出了比特币的设想,这打开了去中心化的大门。 比特币白皮书清晰的描述了去中心化支付的解决方案,并分别从以下几个方面阐述了他的理念: 一、由转账双方点对点的通讯,而不通过中心化的第三方&#xf…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾: 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令(cmd中使用) 3.cuda的检查 4.简单神经网络的流程 1.数据预处理(归一化、转换成张量) 2.模型的定义 …

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101(13000多个视频)和 HMDB-51(7000多个视频)数据集过小,提出了 Kinetics 数据集,并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM:使用2D CNN的好处是可以直接从 Ima…

vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?

用vscode编译uVision 项目只需要安装一个Keil Assistant插件,即可用vscode开发“keil 项目”。极大提高开发速度! 1.安装Keil Assistant插件 安装插件成功之后,应该会让安装一个东西,点击安装即可 2.配置安装包路径 3.打开 uVi…

AR测量工具:精准测量,多功能集成

在日常生活中,我们常常会遇到需要测量物体长度、距离或角度的情况。无论是装修房屋、制作家具,还是进行户外活动,一个精准的测量工具都能大大提高我们的工作效率。AR测量工具就是这样一款集多种功能于一体的实用测量软件,它利用增…