go 语言常见问题(4)

devtools/2024/9/20 1:20:38/ 标签: golang, 开发语言, 后端

31. go语言编程的好处是什么

  • 编译和运行都很快。
  • 在语言层级支持并行操作。
  • 有垃圾处理器。
  • 内置字符串和 maps。
  • 函数是 go 语言的最基本编程单位。

32. 说说go语言的select机制

  • select 机制用来处理异步 IO 问题
  • select 机制最大的一条限制就是每个 case 语句里必须是一个 IO 操作
  • golang 在语言级别支持 select 关键字

33. 解释一下go语言中的静态类型声明

静态类型声明是告诉编译器不需要太多的关注这个变量的细节。静态变量的声明,只是针对于编译的时候, 在连接程序的时候,编译器还要对这个变量进行实际的声明。

34. go的接口是什么

在 go 语言中,interface 也就是接口,被用来指定一个对象。接口具有下面的要素:

  • 一系列的方法
  • 具体应用中并用来表示某个数据类型
  • 在 go 中使用 interface 来实现多态

35. Go语言里面的类型断言是怎么回事

类型断言是用来从一个接口里面读取数值给一个具体的类型变量。
类型转换是指转换两个不相同的数据类型。

36. go语言中局部变量和全局变量的缺省值是什么

全局变量的缺省值是与这个类型相关的零值。

37. go语言编程的好处是什么

  • 编译和运行都很快。
  • 在语言层级支持并行操作。
  • 有垃圾处理器。
  • 内置字符串和 maps。
  • 函数是 go 语言的最基本编程单位。

38. 解释一下go语言中的静态类型声明

静态类型声明是告诉编译器不需要太多的关注这个变量的细节。静态变量的声明,只是针对于编译的时候, 在连接程序的时候,编译器还要对这个变量进行实际的声明。
39. 模块化编程是怎么回事
模块化编程是指把一个大的程序分解成几个小的程序。这么做的目的是为了减少程序的复杂度,易于维护,并且达到最高的效率。
码字不易,请不吝点赞,随手关注,更多精彩,自动送达。

40. Golang的方法有什么特别之处

函数的定义声明没有接收者。
方法的声明和函数类似,他们的区别是:方法在定义的时候,会在func和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。
Go语言里有两种类型的接收者:值接收者和指针接收者。
使用值类型接收者定义的方法,在调用的时候,使用的其实是值接收者的一个副本,所以对该值的任何操作,不会影响原来的类型变量。-------相当于形式参数。
如果我们使用一个指针作为接收者,那么就会其作用了,因为指针接收者传递的是一个指向原值指针的副本,指针的副本,指向的还是原来类型的值,所以修改时,同时也会影响原来类型变量的值。

41. Golang可变参数

函数方法的参数,可以是任意多个,这种我们称之为可以变参数,比如我们常用的fmt.Println()这类函数,可以接收一个可变的参数。
可以变参数,可以是任意多个。我们自己也可以定义可以变参数,可变参数的定义,在类型前加上省略号…即可。

func main() {print("1","2","3")
}func print (a ...interface{}){for _,v:=range a{fmt.Print(v)}fmt.Println()
}

例子中我们自己定义了一个接受可变参数的函数,效果和fmt.Println()一样。
可变参数本质上是一个数组,所以我们向使用数组一样使用它,比如例子中的 for range 循环。

45. JSON 标准库对 nil slice 和 空 slice 的处理是一致的吗

首先 JSON 标准库对 nil slice 和 空 slice 的处理是不一致。
通常错误的用法,会报数组越界的错误,因为只是声明了slice,却没有给实例化的对象。

var slice []int
slice[1] = 0

此时slice的值是nil,这种情况可以用于需要返回slice的函数,当函数出现异常的时候,保证函数依然会有nil的返回值。

empty slice 是指slice不为nil,但是slice没有值,slice的底层的空间是空的,此时的定义如下:

slice := make([]int,0)
slice := []int{}

当我们查询或者处理一个空的列表的时候,这非常有用,它会告诉我们返回的是一个列表,但是列表内没有任何值。
总之,nil slice 和 empty slice是不同的东西,需要我们加以区分的。

46. Golang的内存模型,为什么小对象多了会造成gc压力

通常小对象过多会导致 GC 三色法消耗过多的GPU。优化思路是,减少对象分配。

47. Data Race问题怎么解决?能不能不加锁解决这个问题

同步访问共享数据是处理数据竞争的一种有效的方法。golang在 1.1 之后引入了竞争检测机制,可以使用 go run -race 或者 go build -race来进行静态检测。其在内部的实现是,开启多个协程执行同一个命令, 并且记录下每个变量的状态。

竞争检测器基于C/C++的ThreadSanitizer 运行时库,该库在Google内部代码基地和Chromium找到许多错误。这个技术在2012年九月集成到Go中,从那时开始,它已经在标准库中检测到42个竞争条件。现在,它已经是我们持续构建过程的一部分,当竞争条件出现时,它会继续捕捉到这些错误。

竞争检测器已经完全集成到Go工具链中,仅仅添加-race标志到命令行就使用了检测器。

$ go test -race mypkg// 测试包
$ go run -race mysrc.go// 编译和运行程序 $ go build -race mycmd
// 构建程序 $ go install -race mypkg // 安装程序

要想解决数据竞争的问题可以使用互斥锁sync.Mutex,解决数据竞争(Data race),也可以使用管道解决,使用管道的效率要比互斥锁高。

48. 在 range 迭代 slice 时,你怎么修改值的

在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址。

func main() {data := []int{1, 2, 3}for _, v := range data {v *= 10// data 中原有元素是不会被修改的}fmt.Println("data: ", data)// data:  [1 2 3]
}

如果要修改原有元素的值,应该使用索引直接访问。

func main() {data := []int{1, 2, 3}for i, v := range data {data[i] = v * 10}fmt.Println("data: ", data)// data:  [10 20 30]
}

如果你的集合保存的是指向值的指针,需稍作修改。依旧需要使用索引访问元素,不过可以使用 range 出来的元素直接更新原有值。

func main() {data := []*struct{ num int }{{1}, {2}, {3},}for _, v := range data {v.num *= 10// 直接使用指针更新}fmt.Println(data[0], data[1], data[2])// &{10} &{20} &{30}
}

49. nil interface 和 nil interface 的区别

虽然 interface 看起来像指针类型,但它不是。interface 类型的变量只有在类型和值均为 nil 时才为 nil
如果你的 interface 变量的值是跟随其他变量变化的,与 nil 比较相等时小心。
如果你的函数返回值类型是 interface,更要小心这个坑:

func main() {var data *bytevar in interface{}fmt.Println(data, data == nil)// <nil> truefmt.Println(in, in == nil)// <nil> truein = datafmt.Println(in, in == nil)// <nil> false // data 值为 nil,但 in 值不为 nil
}// 正确示例
func main() {doIt := func(arg int) interface{} {var result *struct{} = nilif arg > 0 {result = &struct{}{}} else {return nil// 明确指明返回 nil}return result}if res := doIt(-1); res != nil {fmt.Println("Good result: ", res)} else {fmt.Println("Bad result: ", res)// Bad result: <nil>}
}

50. select可以用于什么

常用语gorotine的完美退出。
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。

51. 字符串是怎么比较大小的

直接使用 “==”,或者使用 strings.Compare


http://www.ppmy.cn/devtools/111489.html

相关文章

Linux学习-Docker文件系统

Overlayfs Overlayfs 是一种类似 aufs 的一种堆叠文件系统&#xff0c;于 2014 年正式合入 Linux-3.18 主线内核&#xff0c;目前其功能已经基本稳定&#xff08;虽然还存在一些特性尚未实现&#xff09;且被逐渐推广。 Overlayfs 是一种堆叠文件系统&#xff0c;它依赖并建立…

芝法酱学习笔记(0.1)——Ubuntu下,Java开发环境的基本搭建

一、本章目标 书接上回&#xff0c;服务器已经安装完成&#xff0c;下面我们需要安装基本的开发环境。本次学习打算以Java后端开发为中心进行拓展&#xff0c;目前先安装Java开发、部署必备的一些软件。 基础部分 gcc gcc是c的编译软件&#xff0c;一些软件的安装包需要源码…

CORS跨域详解

目录 前言 快速说明 详细解释 Access-Control-Allow-Origin Access-Control-Allow-Credentials Access-Control-Allow-Headers Access-Control-Expose-Headers Access-Control-Allow-Methods Access-Control-Max-Age 前言 假设你已经了解服务端处理CORS跨域问题时,会…

Flink快速上手

Flink快速上手 批处理Maven配置pom文件java编写wordcount代码 有界流处理无界流处理 批处理 Maven配置pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://ww…

数据结构(6)哈希表和算法

一、哈希表 哈希表的基本概念 哈希函数&#xff1a; 哈希函数是将输入&#xff08;键&#xff09;转换为固定大小的输出&#xff08;哈希值&#xff09;的函数。这个输出通常是一个整数&#xff0c;表示在哈希表中的索引位置。理想的哈希函数应该能够均匀分布输入&#xff0c;…

华普微特殊“射频芯片”-隔离芯片品质卓越

HOPERF隔离器技术含量“超标”&#xff01; 作为信号链芯片中的重要一环&#xff0c;隔离芯片的主要作用就是在电力配电系统、工业自动化、医疗设备、可再生能源系统以及通信与数据传输等存在弱电控制强电的场景中实现电气隔离、信号传输与安全防护。 在弱电控制强电的过程中…

SprinBoot+Vue民宿预约微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

springboot 的共享session方案?

问&#xff1a;springboot 的共享session方案&#xff1f; 参考&#xff1a; https://juejin.cn/post/7195227930077691963分布式之session共享问题 4种解决方案及spring session的使用_分布式session共享方案-CSDN博客 什么是 Session &#xff1f; 答&#xff1a;因为Http协…

基于开源WQ装备数据的知识图谱全流程构建

随着大数据和人工智能技术的快速发展&#xff0c;构建领域特定的知识图谱已成为信息管理和决策支持的重要手段。武器装备知识图谱不仅能够对复杂的武器系统进行结构化展示&#xff0c;还可以通过关系推理揭示武器与装备之间的潜在联系。 1、技术路线 本文将详细介绍如何基于开…

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象&#xff0c;被其中的表空间、数据库、schema和用户之间的关系&#xff0c;以及授权管理困惑住了&#xff0c;与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系&#xff0c;以加深…

python 函数 封装

封装 函数的参数是&#xff1a;变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是&#xff1a; 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

测试-Gatling 与性能测试

Gatling 与性能测试详解 一、什么是性能测试&#xff1f; 性能测试是一种软件测试类型&#xff0c;旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试&#xff0c;开发者和运维团队能够识别出系统的瓶颈、优化系统性能&#xff0c;并确保其在实际…

JSON报文根据正则过滤消息

有时候业务系统在接收外部传过来的JSON报文&#xff0c;可能需要根据某个标识来判断是否是自己系统的消息&#xff0c;不是需要过滤。正常我们可能是先将JSON反序列化为具体实体类(例: A a JSON.parseObject(body,A.class))&#xff0c;然后获取具体字段来判断。此方法面对接收…

从0开始学习RocketMQ:领域模型

队列是先进先出&#xff08;FIFO&#xff09;的线性表&#xff0c;通常用链表或者数组来实现。队列只允许在后端&#xff08;称为 rear&#xff09;进行插入操作&#xff0c;在前端&#xff08;称为 front&#xff09;进行删除操作。 主流的消息中间件的传输模型主要为队列模型…

ARCGIS PRO DSK MapTool

MapTool用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。添加 打开MapTool1.vb文件&#xff0c;可以看到系统已经放出MapTool1类&#xff1a; Public Sub New()将 IsSketchTool 设置为 true 以使此属性生效IsSketchTool TrueSketchTyp…

MySQL中的约束

约束概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指数据的精确性&#xff08;Accuracy&#xff09;和可靠性&#xff08;Reliability&#xff09;。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信…

Python自带日志库实现springboot彩色效果

整体目标 涉及的库均为Python3自带库实现 loggingsysenum 终端显示彩色基本原理参考&#x1f449;Terminal里的颜色的那些事 Python打印日志可以直接借用logging自带的库实现&#xff0c;但是默认的打印实在太丑了&#xff0c;长下面这样 这只是一条日志看着还好比较清爽&…

elementUI中el-form 嵌套el-from 如何进行表单校验?

在el-form中嵌套另一个el-form进行表单校验和添加规则&#xff0c;首先&#xff0c;需要确保每个嵌套的el-form都有自己的model、rules和ref。 以下是一个简化的示例&#xff1a; <template><el-form :model"parentForm" :rules"parentRules" r…

Tomcat目录及测试

Tomcat目录及测试 C:\Program4java\apache-tomcat-10.1.7 这个目录下直接包含Tomcat的bin目录&#xff0c;conf目录等&#xff0c;我们称之为Tomcat的安装目录或根目录。 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会…

Zabbix企业级应用案列

随着业务的越发复杂&#xff0c;对软件系统的要求越来越高&#xff0c;这意味着我们需要随时掌控系统的运行情况。因此&#xff0c;对系统的实时监控以及可视化展示&#xff0c;就成了基础架构的必须能力。 一、zabbix可视化 1.Grafana 简介 Grafana 是一个开源的指标量监测和…