go语言八股文(三)
1.java和go的区别
1. 语言设计目标
- Java:
-
- 通用性:设计为一种通用的、面向对象的编程语言,适用于多种应用场景,如桌面应用、服务器端应用、移动应用等。
- 跨平台性:通过“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的理念,通过 Java 虚拟机(JVM)实现跨平台运行。
- 安全性:提供了强大的内存管理和垃圾回收机制,避免了指针操作带来的安全隐患。
- Go:
-
- 系统编程:最初设计用于系统编程、网络编程和并发编程,特别适合构建高性能的服务器和分布式系统。
- 简洁性:语法简洁,注重代码的可读性和开发效率,减少不必要的复杂性。
- 并发支持:内置了强大的并发支持(如 goroutines 和 channels),使得并发编程变得简单高效。
2. 语法和语言特性
- Java:
-
- 面向对象:完全基于类和对象,支持继承、多态和接口等面向对象特性。
- 类型系统:静态类型语言,支持泛型编程。
- 异常处理:通过
try-catch-finally
机制处理异常。 - 代码结构:代码通常组织在类和包中,需要显式定义类和方法。
- Go:
-
- 结构体和接口:支持结构体(struct)和接口(interface),但不支持传统意义上的类继承。接口是隐式的,只要类型实现了接口中的所有方法,就自动满足该接口。
- 类型系统:静态类型语言,但语法更简洁,支持类型推断。
- 错误处理:通过返回错误值(
error
类型)来处理错误,而不是抛出异常。 - 代码结构:代码通常组织在包(package)中,语法简洁,减少了样板代码。
3. 并发模型
- Java:
-
- 线程模型:使用线程(
Thread
)和同步机制(如synchronized
、Lock
等)实现并发。 - 复杂性:并发编程相对复杂,需要手动管理线程的创建、同步和销毁。
- 工具库:提供了丰富的并发工具库,如
java.util.concurrent
包。
- 线程模型:使用线程(
- Go:
-
- Goroutines:内置的轻量级线程,启动成本极低,适合高并发场景。
- Channels:用于在 Goroutines 之间安全地传递数据,简化了并发编程。
- 简洁性:并发模型简单易用,通过
go
关键字启动 Goroutines,通过channel
实现通信。
4. 性能
- Java:
-
- 运行时性能:通过即时编译(JIT)优化,运行时性能接近原生代码,但启动时间可能较长。
- 内存占用:由于 JVM 的存在,内存占用相对较高。
- Go:
-
- 编译型语言:编译成原生代码,启动速度快,运行时性能接近 C/C++。
- 内存占用:内存占用相对较低,适合资源受限的环境。
5. 工具和生态系统
- Java:
-
- 工具丰富:拥有强大的开发工具(如 IntelliJ IDEA、Eclipse)和构建工具(如 Maven、Gradle)。
- 生态系统庞大:有大量的开源库和框架,如 Spring、Hibernate 等。
- Go:
-
- 工具简单高效:官方提供了
go
工具链,支持代码管理、构建、测试等功能。 - 生态系统增长迅速:虽然起步较晚,但近年来发展迅速,特别是在云原生、微服务等领域。
- 工具简单高效:官方提供了
6. 垃圾回收
- Java:
-
- 垃圾回收机制:通过垃圾回收器(GC)自动管理内存,用户无需手动释放内存。
- 复杂性:垃圾回收机制相对复杂,可能会影响程序的性能。
- Go:
-
- 垃圾回收机制:也有垃圾回收机制,但设计目标是尽量减少停顿时间。
- 性能优化:垃圾回收机制在设计上更注重低延迟和高吞吐量。
7. 社区和应用场景
- Java:
-
- 社区庞大:拥有庞大的开发者社区,适用于各种应用场景,如企业级应用、Android 开发等。
- Go:
-
- 社区活跃:社区相对年轻但非常活跃,特别适合构建高性能的服务器、微服务和云原生应用。
总结
- Java 适合需要跨平台、面向对象和复杂业务逻辑的应用场景,如企业级应用、Android 开发等。
- Go 适合需要高性能、并发支持和简洁语法的应用场景,如服务器端编程、微服务、云原生应用等。
2.go语言中defer的变量快照在什么情况下会生效
1. 变量在 defer 被注册时的值被捕获
当 defer 被注册时,它会捕获变量在那一刻的值。如果变量是值类型(如基本类型、结构体等),defer 会捕获该值的副本;如果变量是指针类型,defer 会捕获指针本身,而不是指针指向的值。
示例 1:值类型变量
func main() {x := 5defer fmt.Println(x) // 捕获 x 的当前值 5x = 10fmt.Println("x is now", x) // 输出 x is now 10
} // defer 的 fmt.Println(x) 在这里执行,输出 5
●在 defer 被注册时,x 的值是 5,defer 捕获了这个值。
●后续对 x 的修改(x = 10)不会影响 defer 捕获的值。
●最终,defer 调用 fmt.Println(x) 时输出的是 5,而不是 10。
示例 2:指针类型变量
Go运行代码
func main() {x := 5p := &xdefer fmt.Println(*p) // 捕获指针 p,而不是 p 指向的值x = 10fmt.Println("x is now", x) // 输出 x is now 10
} // defer 的 fmt.Println(*p) 在这里执行,输出 10
●在 defer 被注册时,捕获的是指针 p,而不是 p 指向的值。
●后续对 x 的修改(x = 10)会改变 p 指向的值。
●最终,defer 调用 fmt.Println(*p) 时输出的是 10,而不是 5。
2. 闭包中的变量捕获
如果 defer 调用的是一个闭包(匿名函数),闭包会捕获变量的当前值。捕获的值取决于闭包的定义方式。
示例 3:闭包捕获值类型变量
Go运行代码
func main() {x := 5defer func() {fmt.Println(x) // 捕获 x 的当前值 5}()x = 10fmt.Println("x is now", x) // 输出 x is now 10
} // defer 的闭包在这里执行,输出 5
●闭包捕获了变量 x 在 defer 被注册时的值 5。
●后续对 x 的修改不会影响闭包捕获的值。
●最终,闭包输出的是 5,而不是 10。
示例 4:闭包捕获指针类型变量
Go运行代码
func main() {x := 5p := &xdefer func() {fmt.Println(*p) // 捕获指针 p,而不是 p 指向的值}()x = 10fmt.Println("x is now", x) // 输出 x is now 10
} // defer 的闭包在这里执行,输出 10
●闭包捕获的是指针 p,而不是 p 指向的值。
●后续对 x 的修改会改变 p 指向的值。
●最终,闭包输出的是 10,而不是 5。
总结
defer 的变量快照在以下情况下生效:
1值类型变量:defer 捕获变量在 defer 被注册时的值的副本。后续对变量的修改不会影响 defer 捕获的值。
2指针类型变量:defer 捕获指针本身,而不是指针指向的值。后续对指针指向的值的修改会影响 defer 的输出。
3闭包中的变量捕获:闭包会捕获变量在 defer 被注册时的值,捕获的值取决于变量的类型(值类型或指针类型)。
自学go语言笔记,希望我们可以一起学习!
相关文章:
go语言八股文(三)
1.java和go的区别 1. 语言设计目标 Java: 通用性:设计为一种通用的、面向对象的编程语言,适用于多种应用场景,如桌面应用、服务器端应用、移动应用等。跨平台性:通过“一次编写,到处运行”(Wr…...
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 目录 Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 一、简单介绍 二、现象描述 三、尝试的解决方案 1、根据应用的…...
【工具】scMultiMap基于单细胞多模态数据实现增强子与靶基因的细胞类型特异性映射
文章目录 介绍代码参考 介绍 在与疾病相关的细胞类型中绘制增强子和靶基因图谱,能够为全基因组关联研究(GWAS)变异的功能机制提供关键见解。单细胞多模态数据能够测量同一细胞中的基因表达和染色质可及性,从而实现细胞类型特异性…...
rt-linux下的cgroup cpu的死锁bug
一、背景 rt-linux系统有其非常大的实时性的优势,但是与之俱来的是该系统上有一些天然的缺陷。由于rt-linux系统允许进程在内核态执行的逻辑里,在持锁期间,甚至持spinlock锁期间,都能被其他进程抢占。这一特性能带来实时性的好处…...
Java 内存泄漏 详解
Java 内存泄漏是指程序中某些对象不再被使用,但由于某些原因无法被垃圾回收器(Garbage Collector, GC)回收,导致内存被持续占用,最终可能引发性能问题或 OutOfMemoryError。 本文将从底层原理、源码层面详细解释 Java …...
Rabbit MQ的基础认识
零、介绍 MQ:message queue(消息队列:先进先出) Rabbit MQ: 一、优势 1.应用解耦 2.异步提速 3.削峰填谷 4.总结 二、劣势...
GIS开发笔记(16)解决基于osg和osgearth三维地图上添加placeNode图标点击不易拾取的问题
一、实现效果 二、实现原理 在图标添加的位置同时添加一个红色圆球,半径为5000~8000米,图标和圆球挂接到同一个group节点,group节点再挂接到根节点,当点击到圆球时,通过遍历父节点就可以找到被点击的图标节点。 三、参考代码 //添加图标代码 #pragma once #include &…...
JDBC 使用流程详解
1. 加载数据库驱动 目的:注册数据库驱动类,使 JDBC 能识别特定数据库(如 MySQL、Oracle)。 代码示例: // JDBC 4.0 后无需显式加载驱动(SPI 自动发现),但部分旧项目仍需手动加载 C…...
小白学习java第16天(上): javaWeb
0.背景介绍 1.前言 首先我们需要javaweb里面的大概流程是干什么的,怎么才能实现的?,每一部分是靠什么进行的?以及背后实现的功能是干什么的?。。。。对于我来说要是不解决这些,会让我感觉不踏实ÿ…...
vue 打包设置
1、vue webpack配置 filename: [path][base].gz,// 设置成这样就行了 const { defineConfig } require(vue/cli-service)const debug process.env.NODE_ENV ! productionconst CompressionWebpackPlugin require(compression-webpack-plugin)const TerserPlugin require(…...
Excel如何安装使用EPM插件并且汉化?
Excel如何使用EPM插件 Excel如何使用EPM插件一、安装EPM插件二、启动EPM插件三、插件汉化设置 Excel如何使用EPM插件 一、安装EPM插件 在安装EPM插件时,若运行安装包后出现报错提示,通常是因为系统缺少 Visual Studio 2010 组件,需先安装该…...
在Linux中使用fcntl函数和ioctl函数
特性fcntlioctl作用对象文件描述符(通用文件操作)设备文件(硬件或驱动控制)标准化程度POSIX 标准,行为一致设备相关,无统一标准典型场景文件锁、非阻塞模式、描述符复制终端控制、网络配置、硬件操作移植性…...
ESP32-S3 入门学习笔记(四):LED实验
ESP32-S3 入门学习笔记(四):LED实验 开发板:正点原子ESP32S3 B站学习链接:link 1. GPIO&LED 简介 1.1 GPIO 简介 GPIO 是负责控制或采集外部器件信息的外设,主要负责输入输出功能。以下是ATK-MWS3S…...
clickhouse#复制修改数据
需求 在ClickHouse表中存在一些数据,你需要复制其中几行数据,这个复制不是完全复制,额外需要修改其中某几列数据项。 语句 INSERT INTO xxx_table SELECT * REPLACE ({except_value_1} AS {column_name_1},...{except_value_n} AS {colum…...
Java安全之cc链学习集合
CC1 InvokerTransformer https://blog.csdn.net/weixin_53912233/article/details/137786954 LazyMap https://blog.csdn.net/weixin_53912233/article/details/137787763 CC1链学习记录_cc1 链子 学习-CSDN博客 Java反序列化Commons-Collections篇02-CC1链补充 | Drunk…...
分享:google高级搜索常用的4个入口
网站和文件:google.com/advanced_search图片:google.com/advanced_image_search视频:google.com/advanced_video_search书籍:google.com/advanced_book_search...
内存四区(堆)
在上一次分享中,我和大家分享了栈区,今天栈区来了。 而内存四区中,堆区是干嘛的呢? 堆区,也是用来存放数据的,只不过呢,堆区中的数据的生死存亡是由程序员来控制的。 当然如果你一直不管堆区…...
Ldap高效数据同步- MirrorMode双主复制模式配置详解(下)
#作者:朱雷 上篇:《Ldap高效数据同步- MirrorMode双主复制模式配置详解(上)》 链接: link 文章目录 三、配置Mirror复制类型3.3. 在ldap-0上增加test2用户3.4. 在ldap-1上查看3.5. 在ldap-1上增加test4用户3.7. 最终两台LDAP数据…...
亚组风险比分析与可视化
1. 结果解读 1.1 风险比概述 1.1.1 风险比基本概念 风险比(Hazard Ratio)用于衡量治疗组与对照组事件发生的风险差异。 风险比为1,表示两组风险相同;小于1,治疗组风险低;大于1,治疗组风险高。 1.1.2 性别亚组分析 A性风险比小于1,表明治疗对A性有积极效果,风险降低。…...
2个小时1.5w字| React Golang 全栈微服务实战
文章目录 前言Golang 入门教程1. 下载与环境配置安装 GoWindows 安装macOS 安装Linux 安装 理解 GOROOT 和 GOPATHGOROOTGOPATHGo Modules 与 GOPATH 的关系查看和设置 Go 环境变量 配置 GOPATH 2. 语法与包管理Go 基础语法运行 Go 程序构建 Go 程序包管理 (Go Modules)常用标准…...
Spring security详细上手教学(三)密码管理
Spring security详细上手教学(三)密码管理 本章节两部分内容 实现PasswordEncoder使用Spring Security Crypto模块提供的工具 1. 使用 password encoder 通常,系统不会使用纯文本来保存密码,需要进行加密/哈希等一系列处理以加…...
ADC读取异常情况汇总
MCU ADC读取内部参考电压 Vrefint 如果某个输入引脚的电压高于供电电压,可能存在读取内部参考电压数值不准或者读数是4095。 虽然宽电压支持,最好硬件设计硬件避免这种情况,避免异常情况。...
给函数参数设置默认值的方式
在 JavaScript 中,给函数参数设置默认值主要有以下几种方式: 1. 函数体内手动检查赋值(ES5 及以前) 在函数内部检查参数是否为 undefined,然后手动赋值默认值。 function greet(name, age) {name name ! undefined…...
【C语言】内存分配的理解
很多时候我们声明变量,系统就自动为我们处理好了内存。 这主要取决于内存分配发生的时间和内存区域。C语言中主要有以下几种内存分配方式: 栈 (Stack) 内存分配 (自动内存): 何时发生: 在函数内部声明的非static局部变量(包括基本类型如 int…...
特征工程四:数据特征提取TfidfVectorizer的使用
TfidfVectorizer 深度解析 TfidfVectorizer 是 scikit-learn 中用于文本特征提取的核心工具,它将原始文本转换为 TF-IDF 特征矩阵,是自然语言处理(NLP)和文本挖掘的基础组件。 一、核心原理 1. TF-IDF 计算 TF (Term Frequency):词频&…...
深度学习涉及的数学与计算机知识总结
深度学习涉及的数学与计算机知识可总结为以下核心模块,结合理论与实践需求分为数学基础和计算机技能两大方向: 一、数学知识 线性代数 核心:矩阵运算(乘法、转置、逆矩阵)、向量空间、特征值与特征向量、奇异值分解&am…...
引领印尼 Web3 变革:Mandala Chain 如何助力 1 亿用户迈向数字未来?
当前 Web3 的发展正处于关键转折点,行业亟需吸引新用户以推动 Web3 的真正大规模采用。然而,大规模采用面临着核心挑战:数据泄露风险、集中存储的安全漏洞、跨系统互操作性障碍,以及低效的服务访问等问题。如何才能真正突破这些瓶…...
Mysql从入门到精通day6————时间和日期函数精讲
关于Mysql的日期和时间计算函数种类非常繁多,此处我们对常用的一些函数的用法通过实例演示让读者体会他们的用法,文章末尾也给出了时间和日期计算的全部函数 函数1:curdate()和current_date()函数 作用:获取当前日期 select curdate(),current_date();运行效果:...
C#如何正确的停止一个多线程Task?CancellationTokenSource 的用法。
在 C# 中停止一个 Task 需要谨慎处理,因为直接强制终止(如 Thread.Abort())会导致资源泄漏或状态不一致。推荐使用 协作式取消(Cooperative Cancellation) 通过 CancellationToken 实现安全停止。以下是详细方…...
【Redis】Redis Zset实现原理:跳表+哈希表的精妙设计
一、实现: Zset有序集合是一种由 跳表(Skip List)哈希表(Hash Table) 实现的数据结构。 二、特点功能: Set特性排序 三、跳表与哈希表分析: Zset的实现由两个数据结构: 1.跳表(Skip List):用于存储数据的排序和快…...
【前端】jQuery 对数据进行正序排列
你可以使用 jQuery 对数据进行正序排列(按 jbsj 升序)。以下是完整的代码示例: <!DOCTYPE html> <html> <head><title>按时间排序</title><script src"https://code.jquery.com/jquery-3.6.0.min.js&…...
Matlab 报错:尝试将 SCRIPT vl_sift 作为函数执行:
问题描述: 运行matlab程序出现报错: 警告: 名称不存在或不是目录: xxx\vlfeat-0.9.21\toolbox\mex\mexw64 xxxx 尝试将 SCRIPT vl_sift 作为函数执行: xxxx\vlfeat-0.9.21\toolbox\sift\vl_sift.m原因分析: 缺少 \vlfeat-0.9.21\toolbox…...
前端权限管理
前端权限 本质上就是控制前端视图层的展示和前端所发送的请求 一、RBAC 用户(User):系统的使用者 角色(Role):权限的集合(如管理员、普通用户)。 权限(Permission&am…...
【PVR】《Adaptive Palm Vein Recognition Method》
[1]程良彬.自适应的手掌静脉识别方法研究[D].桂林电子科技大学,2023.DOI:10.27049/d.cnki.ggldc.2023.000681. 文章目录 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Method4.1、Datasets and Metrics4.2、基于最大化手掌内切圆的感兴趣区域提…...
MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略
MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略 目录 LEGO-Puzzles的简介 1、LEGO-Puzzles的特点 LEGO-Puzzles的安装和使用方法 1、安装 步骤 0:安装 VLMEvalKit 步骤 1:设置 API 密钥(可选…...
一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili DataFrame的基础信息和统计性信息。在我们拿到一 个数据集,用Pandas载入后,需要做一些初步的…...
【大模型微调与应用开发实战指南】从理论到工业级部署
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(LoRA微调)运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、…...
动手学深度学习11.10. Adam算法-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:11.10. Adam算法 — 动手学深度学习 2.0.0 documentation 本节开源代码…...
Spring Boot API版本控制实践指南
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在API迭代过程中,版本控制是保障系统兼容性的重要机制。合理的版本控制策略可以帮助开发团队平滑过渡接口变更,同时支持多版本客…...
如何让自己的博客可以在百度、谷歌、360上搜索到(让自己写的CSDN博客可以有更多的人看到)
发现自己写的博客文章名复制,然后粘贴到百度进行搜索,发现搜索不到自己的,但是会显示其他人的CSDN博客。于是查找相关资料,整理出以下搜索引擎资源收录入口,把自己的文章链接输入进去,然后经过审核通过后&a…...
Transformer
一、为什么需要Transformer?先看传统模型的痛点 1. 传统模型:RNN与CNN的短板 RNN(循环神经网络):逐个处理单词,像流水线作业。 问题:速度慢(无法并行&…...
LeetCode热题100--438.找到字符串中所有字母异位词--中等
1. 题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s “cbaebabacd”, p “abc” 输出: [0,6] 解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。 起始…...
仿微信上传头像,实现拍摄、相册选择、手动缩放、裁剪、蒙版、撤回、还原、上传微信本地文件功能
目前功能基于wx-cropper进行开发,wx-cropper 是一个基于微信小程序的图片裁剪工具 项目地址:gitcode地址 一、触发入口标签 <t-cell hover arrow class"userCell" catchtap"handleChangeHeadImg"><view slot"title&…...
Python 操作 Excel 插入图表:解锁数据可视化的高效密码
Python 操作 Excel 插入图表:解锁数据可视化的高效密码 在数据分析与展示的领域中,Python 凭借其强大的库支持,成为众多开发者与数据工作者的得力助手。将图表嵌入 Excel 文件,不仅能丰富数据呈现形式,还能让信息传递…...
python实战项目66:抓取考研招生专业信息
python实战项目66:抓取考研招生专业信息 一、流程分析二、完整代码一、流程分析 考研招生专业信息所在网页主页如下图: 在搜索框中输入所需查询的专业 点击“开设院校”,如下图所示: 打开浏览器开发者工具抓包,刷新页面,找到xhr数据包。 首先,在zydws.do数据包中抓…...
Awesome-Embodied-AI: 具身机器人的资源库
💡 你是否在寻找具身人工智能(Embodied AI)领域的研究资源?是否希望有一个系统性的资源集合来加速你的研究?今天给大家推荐一个重磅项目! 🌟 为什么需要这个项目? 具身人工智能是一…...
Java位运算符大全
1. Java 支持的位运算符 Java 提供了 7 种位运算符: 运算符名称描述示例&按位与(AND)两个位都为 1 时,结果才为 15 & 3 → 1|按位或(OR)两个位有一个为 1 时,结果就为 15 | 3 → 7^按…...
Using the NCCL Library: A Practical Guide
文章目录 Using the NCCL Library: A Practical GuidePrerequisitesBasic NCCL ConceptsPractical Demo CodeCompilation and ExecutionKey Steps ExplainedCommon Patterns1. Point-to-Point Communication2. Broadcast3. Using Streams Best Practices Using the NCCL Librar…...
UML 活动图详解之小轿车启动活动图分析
目录 一、UML 活动图概述 二、UML 活动图的构成元素详解 (一)活动 (二)动作状态 (三)活动状态 (四)迁移(转换) (五)初始节点 …...
58常用控件_QTextEdit的使用
目录 代码示例: 获取多行输入框的内容 代码示例:验证输入框的各种信号 QTextEdit 表示多行输入框也是一个富文本 & markdown 编辑器 并且能在内容超出编辑框范围时自动提供滚动条 QTextEdit不仅能表示纯文本,还可以表示html和markdown QPlainTextE…...