Golang基础问题

在这里插入图片描述

Go基础

文章目录

  • Go基础
    • ● Go有那些关键字?
    • ● Go方法与函数的区别?
    • ● Go函数返回局部变量的指针是否安全?
    • ● Go函数参数传递是值传递还是引用传递?
    • ● defer关键字的实现原理?
    • ● 内置函数make和new的区别?
    • ● for range 的时候它的地址会发生变化吗?
    • ● 简单说一下defer的底层实现原理?defer recover的问题?
    • ● uint类型溢出?
    • ● 介绍rune类型
    • ● golang中解析tag是怎么实现的?反射原理是什么?
    • ● 调用函数传入结构体时,应该传值还是指针?
    • ● Slice遇到过什么坑?
    • ● 两个切片要如何比较?
    • ● Go闭包是什么?
    • ● 深拷贝和浅拷贝?
    • ● init函数的执行时机?
    • ● Go 语言中的数组?

欢迎大家观看,如果遇到不合适的答案可以打在评论区,我们一起探讨。

● Go有那些关键字?

package、import、func、return、defer、var、const、interface、struct、chan、map、type、break、case、continue、for、fallthrough、else、if、switch、goto、default、range、go、select。

● Go方法与函数的区别?

函数是指不属于任何结构体的方法。但方法是属于某个结构体的。

● Go函数返回局部变量的指针是否安全?

是安全的。 Go编译器将会对每个局部变量进行逃逸分析。如果发现有局部变量的作用域超出该函数,则不会将内存分配在栈上,而是在堆上,因为他们不在栈区,即使释放函数,其内容也不会受影响。

● Go函数参数传递是值传递还是引用传递?

值传递。 Go中都是值传递,没有引用传递。 如果参数是引用类型,可以修改原内容数据,否则不可以。

● defer关键字的实现原理?

defer可以推迟当前函数返回前才实际执行。 defer和recover结合,形成了Go语言风格的异常与捕获机制。

● 内置函数make和new的区别?

1、作用变量类型不同,new可以对任何类型使用,make只能对切片、字典、通道使用。 2、返回类型不一样,new返回指针,make返回变量本身。 3、new分配的空间被清零,make分配的会初始化。

● for range 的时候它的地址会发生变化吗?

不会。在for range循环中,循环变量的地址在每次迭代时是复用的,直接传递循环变量的地址可能导致所有协程共享同一个地址,出现数据竞争和不期望的行为。

● 简单说一下defer的底层实现原理?defer recover的问题?

先进后出,类似于栈。defer延迟函数,释放资源,收尾工作;如释放锁,关闭文件,关闭链接;捕获panic; 每个 defer 语句都对应一个_defer 实例,多个实例使用指针连接起来形成一个单链表,保存在 gotoutine 数据结构中,每次插入_defer 实例,均插入到链表的头部,函数结束再一次从头部取出,从而形成后进先出的效果。 recover结合defer可以捕获异常,从而防止程序崩溃。recover只有在defer函数中有效。

● uint类型溢出?

无符号整型。2^32-1,如果超出了所能表示的范围,就会发生溢出。溢出不会引发错误或panic,而是导致结果按照模运算。

● 介绍rune类型

相当int32。 golang中的字符串底层实现是通过byte数组的,中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。byte 等同于int8,常用来处理ascii字符rune 等同于int32,常用来处理unicode或utf-8字符

● golang中解析tag是怎么实现的?反射原理是什么?

Go 中解析的 tag 是通过反射实现的,反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力或动态知道给定数据对象的类型和结构,并有机会修改它。反射将接口变量转换成反射对象 Type 和 Value;反射可以通过反射对象 Value 还原成原先的接口变量;反射可以用来修改一个变量的值,前提是这个值可以被修改;tag是啥:结构体支持标记,name string json:name-field 就是 json:name-field 这部分

● 调用函数传入结构体时,应该传值还是指针?

传值时,函数会获得给结构体的一个副本,对该副本修改不会影响原来的结构体。 传指针时,引用类型,对指针指向的结构体进行任何的修改都会修改原来的结构体。

● Slice遇到过什么坑?

1、切片容量 切片容量自动增长,当容量不足时,Go会分配一个新的底层数组,并将旧的数组的内容复制到新的数组中。如果频繁增加元素可能导致意外。 应对策略:预先分配足够的容量。 2、切片是对底层数组的引用,多个切片可以共享同一个底层数组。修改一个切片的元素可能会影响其他共享同一底层数组的切片。 如果需要独立的副本,可以使用copy函数创建一个新的切片。 3、切片越界。 4、切片的零值是nil。

● 两个切片要如何比较?

切片不能使用==进行比较,要使用reflect.DeepEqual()进行比较。

● Go闭包是什么?

闭包就是一个可以引用自身作用域之外的变量的函数。即使外部函数完成执行并且作用域被破坏,依然可以访问。

● 深拷贝和浅拷贝?

切片、字典、通道都是引用拷贝,也就是浅拷贝。其余的都是值拷贝,也就是深拷贝。 深拷贝拷贝的是数据本身,创造一个新的对象,并在内存中开辟一个新的内存地址,与原对象是完全独立的,不共享内存,修改新对象时不会影响原对象的值。释放内存时,也没有任何关联。 浅拷贝拷贝的是数据地址,只复制指向的对象的指针,新旧对象的内存地址是一样的,修改一个另一个也会变。释放内存时,同时释放。

● init函数的执行时机?

一个包下可以有多个 init 函数,每个文件也可以有多个 init 函数。多个 init 函数按照它们的文件名顺序逐个初始化。应用初始化时初始化工作的顺序是,从被导入的最深层包开始进行初始化,层层递出最后到 main 包。不管包被导入多少次,包内的 init 函数只会执行一次。应用初始化时初始化工作的顺序是,从被导入的最深层包开始进行初始化,层层递出最后到 main 包。但包级别变量的初始化先于包内 init 函数的执行。

● Go 语言中的数组?

数组是存放元素的容器,Go 语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量

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

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

相关文章

kotlin协程的理解

伴生对象:companion object 其实质等同于Java中的单例模式 协程:通常实现是用户态的任务协作式调度 一段可执行代码可挂起/可恢复执行概念上与语言无关,协程这个概念于1958年提出 依赖框架: 协程的启动: 1.协程体&a…

大模型LLMs概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题:Large Language Models for Generative Information Extraction: A Survey 论文链接:https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型(LLMs)在生成式信息抽取(IE)任务中的应用…

属性描述符初探——Vue实现数据劫持的基础

目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么? ​编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…

Desktop docker 部署 WordPress

Desktop Docker 部署 WordPress 之前都是在Linux里面玩的,今天看到别人在windwos下安装docker,一时兴起装了一个试试,效果一般,很吃硬盘空间和内存。 首先在docker官方下载桌面版,安装下一步一直到完成。 安装完docker会自动加入到环境变量,而且docker-compose也会一并安…

sql业务场景分析思路参考

1、时间可以进行排序,也可以用聚合函数对时间求最大值max(时间) 例如下面的例子:取最晚入职的人,那就是将入职时间倒序排序,然后limit 1 表: 场景:查找最晚入职员工的所有信息 se…

第十四届蓝桥杯省赛C++B组F题【岛屿个数】题解(AC)

题目大意 给定一个 01 地图,分别表示陆地和海,问地图中一共有多少块岛屿?另外,若一个岛屿在另一个岛屿的内部,则不统计。如下图中的大岛屿包含着内部的小岛屿,故内部小岛屿不计算,最终输出 1。…

vue3自定义全局指令和局部指令

1.全局指令 el:指令绑定到的DOM元素,可以用于直接操作当前元素,默认传入钩子的就是el参数,例如我们开始实现的focus指令,就是直接操作的元素DOM binding:这是一个对象,包含以下属性:…

【C#】ProgressBar进度条异步编程思想

1.控件介绍 进度条通常用于显示代码的执行进程进度,在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中,有三个值常用: Value表示当前值,Minimum表示进度条范围下限,Maximum表示进度条范围上限。 2.简单实…

简单的git pull fail Can‘t update has no tracked branch解决记录

简单的git pull fail Can‘t update has no tracked branch解决记录 1. 问题描述 上午同事使用idea拉取代码的时候,发现拉取不了,提示用户权限问题,之后修改了git用户信息,发现还是拉取不了分支代码,然后删除了git r…

对FPGA开发流程系统的学习

FPGA 开发流程: HDL(Hardware Design Language)和原理图是两种最常用的数字硬件电路描述方法,HDL 设计法具有更好的可移植性、通用性和模块划分与重用性的特点,在目前的工程设计中被广泛使用。所以,我们在…

WPF在.NET9中的重大更新:Windows 11 主题

在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论。 对三个事项发起了投票。 第一个是Windows 11 主题 第二个是更新的控件 第三个是可空性注释 最终Windows 11 主题得票最高,WPF团队2023-2024的工作优先级就是Windows…

网安小贴士(8)IPv4与IPv6

一、前言 IPv4和IPv6都是互联网协议(IP)的版本,它们用于在互联网上标识和定位设备。 二、定义 IPv4(互联网协议第四版): IPv4是互联网协议的第一个广泛使用的版本,最初在1981年被标准化为RFC 7…

交换数字00

题目链接 交换数字 题目描述 注意点 numbers.length 2-2147483647 < numbers[i] < 2147483647 解答思路 不适用临时变量&#xff0c;可以先将numbers[0]和numbers[1]的信息都存到某个位置&#xff08;可以相加可以相减或其他位操作&#xff09;&#xff0c;然后另一…

SpringBoot 通过Knife4j集成API文档 在线调试

介绍 Knife4j 是一款基于 Swagger 构建的增强型 API 文档生成工具&#xff0c;它提供了更多的定制化功能和界面优化&#xff0c;使得生成的 API 文档更加美观和易用。它可以帮助开发者快速生成和管理 API 文档&#xff0c;支持在线调试和交互。 依赖 <!--knife4j--> &…

期末C语言易错知识点整理

1.在定义多维数组时&#xff0c;除了最左边的维度&#xff0c;其余的维度必须明确指定大小 2.int m[1][4]{4}; 定义的是一个 1 行 4 列的二维数组&#xff0c;初始化时提供了一个元素 4&#xff0c;其余元素默认初始化为 0&#xff0c;因此是正确的。 3.二维数组 a[3][6] 中的索…

谷粒商城学习笔记-05-项目微服务划分图

文章目录 一&#xff0c;商城业务服务-前端服务二&#xff0c;商城业务服务-后端服务三&#xff0c;存储服务四&#xff0c;第三方服务五&#xff0c;服务治理六&#xff0c;日志七&#xff0c;监控预警系统1&#xff0c;Prometheus2&#xff0c;Grafana3&#xff0c;Prometheu…

科技助力农业——土壤化肥测试仪

在农业生产中&#xff0c;土壤养分是作物健康生长的关键因素。然而&#xff0c;如何科学、精准地评估土壤养分含量&#xff0c;指导农民合理施肥&#xff0c;一直是农业科研和技术人员努力的方向。近年来&#xff0c;随着科技的进步&#xff0c;土壤化肥测试仪作为一种新型农业…

clion远程开发

clion远程开发 简要概括&#xff1a; 建立 SFTP 通讯&#xff0c;创建远程目录与本地目录的映射文件夹&#xff0c;就可以把本机文件夹中的文件用鼠标右键选中上全传&#xff0c;打开自动同步功能&#xff0c;后面更改文件就可以自动同步文件了。 一.新建SFTP远程链接服务 …

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件&#xff0c;左上角就会自动显示帧率

Java面试八股之MYISAM和INNODB有哪些不同

MYISAM和INNODB有哪些不同 MyISAM和InnoDB是MySQL数据库中两种不同的存储引擎&#xff0c;它们在设计哲学、功能特性和性能表现上存在显著差异。以下是一些关键的不同点&#xff1a; 事务支持&#xff1a; MyISAM 不支持事务&#xff0c;没有回滚或崩溃恢复的能力。 InnoDB…