Golang基础面试题1

来源于fullstack,绿色为重点

1. Go语言是什么

Go 是一种通用编程语言,设计初衷是为了进行系统编程。它最初是由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 在 2007 年开发的。Go 语言是强类型且静态类型的,它内置了对垃圾回收的支持,并支持并发编程。程序通过使用包(package)来构建,以高效管理依赖关系。Go 编程的实现使用传统的编译和链接模型来生成可执行二进制文件。

简而言之,Go 语言是为了高效、可靠和并发地构建软件系统而设计的,特别适用于需要高性能和快速开发的场景。

2.Go是语言?库?还是框架

Go 不是库也不是框架,它是一种全新的语言。

Go 语言主要在 C 语言家族(基本语法)的基础上发展而来,同时也大量借鉴了 Pascal/Modula/Oberon 家族(声明、包)的特点。Go 语言拥有一个庞大的库,被称为运行时(runtime),它是每个 Go 程序的一部分。尽管运行时对于语言来说更加核心,但 Go 的运行时与 C 语言库 libc 是类似的。然而,重要的是要理解,Go 的运行时并不包括一个虚拟机,如 Java 运行时所提供的那样。Go 程序会提前编译成原生机器代码。

简而言之,Go 语言通过提前编译成原生机器代码来提供高效的性能,而不是依赖虚拟机来执行代码。这使得 Go 程序在运行时可以接近或达到与用底层语言(如 C 或 C++)编写的程序相同的性能水平。

3.Go有异常exceptions吗

不,Go 语言采用了不同的方法。对于普通的错误处理,Go 语言的多返回值特性使得报告错误而不重载返回值变得非常容易。Go 代码使用错误值来指示异常状态。

具体来说,Go 鼓励函数返回两个值:预期的结果和一个错误值。当函数遇到错误时,它会返回一个非空的错误值,调用者可以检查这个错误值以确定是否发生了错误,并据此采取适当的行动。这种错误处理模式在 Go 社区中非常普遍,它提供了一种清晰、简洁的方式来处理错误,同时避免了像其他语言中使用异常处理机制可能带来的性能开销和复杂性。

func Open(name string) (file *File, err error)
f, err := os.Open("filename.ext")
if err != nil {log.Fatal(err)
}
// do something with the open *File f

4. Go支持什么样的类型转换

Go 语言在显式类型方面非常严格。它不支持自动的类型提升或转换。要将一个类型的变量赋值给另一个类型的变量,需要显式的类型转换

这意味着你不能简单地将一个整数(int)赋值给一个浮点数(float64)变量,除非你明确地告诉 Go 语言你希望进行这样的转换。这种显式的类型转换要求有助于减少错误和类型不匹配的问题,使得代码更加清晰和可维护。

例如,如果你有一个 int 类型的变量 i,你想将它赋值给一个 float64 类型的变量 f,你需要这样做:

i := 42  
f := float64(i) // 显式类型转换

5. 使用Go语言的好处

  • 支持类似于动态语言的编程模式:例如类型推断(x := 0 是有效声明一个类型为 int 的变量 x 的方式)。

  • 编译速度快

  • 内置并发支持:比如轻量级的进程(通过 goroutines)、通道(channels)和 select 语句来支持并发编程

  • 简洁性、简单性和安全性

  • 支持接口和类型嵌入:Go 语言支持接口,这使得代码更加灵活和可重用。此外,类型嵌入允许在一个类型中嵌入另一个类型的字段,从而简化了代码结构。

  • 支持静态链接:Go 编译器支持静态链接,这意味着所有的 Go 代码可以被静态链接到一个单独的大二进制文件中。这使得部署到云服务器变得容易,无需担心依赖关系的问题。

6. Go语言是如何被创造的

Go 语言的诞生源于对现有系统编程语言及其环境的失望。Go 语言试图实现以下目标:

  1. 拥有解释型、动态类型语言的特性,同时保持静态类型、编译型语言的高效性和安全性。
  2. 支持网络和多核计算。
  3. 快速编译。

为了实现这些目标,需要解决一系列语言学问题,如表达性强但轻量级的类型系统、并发和垃圾回收、严格的依赖规范等。这些问题无法仅通过库或工具来很好地解决,因此诞生了新的编程语言 Go。

7. Goroutine是什么

Goroutine 是与其他函数或方法并发运行的函数或方法。可以将 Goroutine 视为轻量级的线程。与线程相比,创建 Goroutine 的成本非常小。在 Go 应用程序中,通常会有数千个 Goroutine 同时运行,这是很常见的。

在 Go 中,你可以使用 go 关键字来启动一个 Goroutine。例如:

go func() {  // 这个匿名函数将会作为一个 Goroutine 运行  fmt.Println("Hello, World!")  
}()

在上面的代码中,go 关键字告诉编译器将匿名函数作为一个独立的 Goroutine 来执行,而不会阻塞当前的执行流。

Goroutine 的调度和管理是由 Go 运行时(runtime)自动处理的,开发者通常不需要关心底层的线程管理细节。这使得并发编程在 Go 中变得简单而高效。

8. 一个函数允许有多个返回值吗

允许

package main
import "fmt"func swap(x, y string) (string, string) {return y, x
}
func main() {a, b := swap("Tom", "Jerry")fmt.Println(a, b)
}

9. Go里的动态类型变量声明

动态类型变量声明要求编译器根据传递给变量的值来解释变量的类型。编译器不需要变量具有静态类型作为必要条件。

10. 可以一次性声明不同类型的变量吗

可以,使用类型推理可以一次性使用不同类型的变量

var a, b, c =  3,  4,  "foo"  

11.Go里的静态类型变量声明是什么

在Go语言中,静态类型变量声明为编译器提供了保证,即存在一个具有给定类型和名称的变量,这样编译器就可以在不需要知道变量完整细节的情况下继续进行编译。变量声明只在编译时有其意义,编译器在程序链接时需要实际的变量声明。

// 静态类型变量声明  
var age int  // 声明一个名为 age 的变量,类型为 int  
var name string // 声明一个名为 name 的变量,类型为 string  // 为变量赋值  
age = 30  
name = "Alice"

12. 使用Go的时候有哪些优势

Go 是一种尝试引入新的、并发的、带有快速编译和以下优点的垃圾收集语言:

  • 可以在单个计算机上在几秒钟内编译一个大型 Go 程序。

  • Go 提供了一种软件构建模型,使依赖关系分析变得简单,并避免了 C 风格包含文件和库的许多开销。

  • Go 的类型系统没有层次结构,因此不会花费时间去定义类型之间的关系。虽然 Go 有静态类型,但该语言试图使类型感觉比典型的面向对象语言更轻量级。

  • Go 完全支持垃圾收集,并为并发执行和通信提供基本支持。

  • 通过其设计,Go 提出了一种在多核机器上构建系统软件的方法。

13. 指针是什么

指针可以保存变量的地址

var x =  5 
var p *int p =  &x
fmt.Printf("x = %d",  *p)

*运算符,叫解引用运算符,访问地址中的值;&运算符,称为地址运算符,用于返回变量的地址

14. 如何高效拼接字符串

详细方法对比

从Go 1.10版本开始,引入了一个名为strings.Builder的类型,它用于高效地生成字符串,通过Write方法实现。使用strings.Builder可以最小化内存复制操作,从而提高字符串拼接的性能。此外,strings.Builder的零值(即未初始化的状态)已经准备好可以直接使用,无需进一步初始化。

package mainimport ("strings""fmt"
)
func main() {var sb strings.Builderfor i := 0; i < 1000; i++ {sb.WriteString("a")}fmt.Println(sb.String())
}

15. Go里的类型rune是什么

在Go语言中,rune类型是一个别名,它等价于int32类型。它被用来表示一个Unicode字符。Go语言使用UTF-8编码来表示字符串,UTF-8编码是一种可变长度的编码方式,一个字符可以由1到4个字节表示。由于一个字节可能不足以表示一个完整的字符,特别是对于那些大于一个字节且小于等于4个字节的字符(如中文字符),使用rune类型就非常有用。

以下是一个使用rune类型的示例:

package main  import "fmt"  func main() {  var r rune = '中' // '中'是一个中文字符,使用rune类型来表示  fmt.Println(r)    // 输出:中  s := "Hello, 世界!"  for _, c := range s {  fmt.Println(c) // 遍历字符串s中的每一个字符,并打印出来  }  
}

Go 语言中,字符串的底层表示是 byte (8 bit) 序列,而非 rune (32 bit) 序列。例如下面的例子中 使用 UTF-8 编码后各占 3 个 byte,因此 len("Go语言") 等于 8,当然我们也可以将字符串转换为 rune 序列。

fmt.Println(len("Go语言")) // 8
fmt.Println(len([]rune("Go语言"))) // 4

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

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

相关文章

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南 安装Anaconda或Miniconda&#xff1a; 首先&#xff0c;您需要从官方网站下载适用于ARM架构的Anaconda或Miniconda安装包。下载完成后&#xff0c;在终端中使用bash Anaconda3-2019.10-Linux-armv8.sh&#xff08;文件…

【JVM】StringTable 字符串常量池

参考&#xff1a;javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式&#xff08;区别于new&#xff09;给一个…

利用小红书笔记详情API:轻松获取海量笔记内容

小红书是一个非常流行的社交分享平台&#xff0c;特别是深受年轻人喜欢&#xff0c;因为它提供了用户分享生活方式、时尚、美妆、旅行、美食等内容的功能。如果你希望从小红书上获取大量的笔记内容&#xff0c;那么利用小红书的API是一个很好的选择。下面&#xff0c;我将为你介…

图像复原天花板!IR开创性新作实现最佳视觉质量,修复更智能、更逼真

图像复原&#xff08;IR&#xff09;指在已知图像退化的原因和模型的情况下&#xff0c;通过一系列的逆过程来恢复出原始图像的过程。这是一个长期的低级视觉任务&#xff0c;也是图像处理领域的一个重要课题。 随着深度学习技术的发展&#xff0c;图像复原领域不断出现新的网…

容器库(13)-std::unordered_multimap

unordered_multimap是含有键值对的无序关联容器&#xff0c;搜索、移除和插入操作是平均常数的时间复杂度。unordered_multimap在内部没有按任何顺序排列&#xff0c;而是放在桶当中的&#xff0c;放进哪个桶是通过计算key的hash值来决定的。和unordered_map不同的是&#xff0…

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

《剑指 Offer》专项突破版 - 面试题 59、60 和 61 : 详解堆的应用(C++ 实现)

目录 前言 面试题 59 : 数据流的第 k 大数字 面试题 60 : 出现频率最高的 k 个数字 面试题 61 : 和最小的 k 个数对 前言 堆最大的特点是最大值或最小值位于堆的顶部&#xff0c;只需要 O(1) 的时间就可以求出一个数据集合中的最大值或最小值&#xff0c;同时在堆中添加或…

金融保险领域统一消息发送平台

项目介绍&#xff1a;系统为金融保险行业统一推送基础平台&#xff0c;日均推送消息2000万条&#xff0c;支持短信、官微、邮件多种发送渠道。 项目定位&#xff1a;结合公司项目产品化战略&#xff0c;从基础的推送能力出发&#xff0c;形成公司的统一推送基础产品 项目功能…

STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录 1. RTC 实时时钟的应用场景 2. RTC 的配置与初始化 2.1 设置 RTC 时钟源 2.2 初始化 RTC 寄存器 2.3 中断配置 2.4 备份寄存器配置 2.5 校准 RTC 3. 实例演示代码 4. 总结 1. RTC 实时时钟的应用场景 实时时钟&#xff08;RTC&#xff09;在嵌入式系统中具有广泛…

用C#开发Excel插件的强大开源工具

推荐一个开源项目&#xff0c;方便我们使用C#为Excel开发插件。 01 项目简介 Excel-DNA是一个.Net开源项目&#xff0c;为开发者提供了一种便利的方法&#xff0c;可以将.Net代码与Excel集成&#xff0c;能够轻松的为Excel创建自定义函数、图表、表单等&#xff0c;一方面不仅…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

【C语言基础】:操作符详解(二)

文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性&#xff1a;优先级、结合性1. 优先级2. 结合性 操作符详解 上期回顾&#xff1a;【C语言基础】&#xff1a;操作符详解(一) 一、上期扩展 …

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

进程间通信学习笔记(有名管道和无名管道)

进程间通信方式&#xff1a; 无名管道(pipe)有名管道(fifo)信号(signal)共享内存(mmap)套接字(socket) 无名管道&#xff1a; 在内核里面开辟一片内存&#xff0c;进程1和进程2都可以通过这片内存进行通信 无名管道特点&#xff1a; 只能用于具有亲缘关系的进程之间的通信&am…

YOLOv9图像标注和格式转换

一、软件安装 labelimg安装&#xff08;anaconda&#xff09; 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…

从Unity到Three.js(shader创建)

本文介绍three.js 中shader的创建和应用到模型&#xff0c;具体shader的语法和函数应用&#xff0c;已经有很多大佬总结过了。 three.js shader详解 import * as THREE from three;const scene new THREE.Scene();//创建场景 scene.backgroundnew THREE.Color(0,0.1,0.2,1);/…

系统找不到xinput1_3.dll怎么办?试试这五种解决方法轻松搞定

在计算机系统运行过程中&#xff0c;当我们遭遇“找不到xinput1_3.dll”这一错误提示时&#xff0c;实际上正面临一个软件兼容性、系统组件缺失以及游戏或应用程序无法正常启动的关键问题。深入探究这一现象&#xff0c;我们会发现它可能引发一系列连带问题&#xff0c;例如某些…

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…

车载终端_联发科MTK6762车载平板电脑解决方案

智能车载终端方案搭载了MTK联发科8xARM Cortex-A53(64bit)高速CPU&#xff0c;采用12nm工艺制程&#xff0c;提供更快的数据采集速度和APP响应速度&#xff0c;能够快速满足用户的应用需求。配备3GB RAM32GB ROM的低功耗EMCP一体化存储&#xff0c;性能良好&#xff0c;支持多任…

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…