当前位置: 首页 > news >正文

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客

一些题目整理,附带大佬的解释

1.go中哪些值不能寻址&

常量(const常量,字面值3.14,字符串“xxx”,函数或方法, map的val值)

golang中接口的值为什么是不可寻址的,以及golang中哪些是不可取址的_golang 不可寻址-CSDN博客

2.range的一个返回值和两个返回值

3.有缓冲的和无缓冲channel

有缓冲的channel和无缓冲的channel_wx6360867ce0633的技术博客_51CTO博客

无缓冲的chan要求是从发送方拿到的东西立刻给接收方,不得延误,所以实时性高(同步)。

有缓冲的chan对会先放到缓冲里, 缓冲填满后再发送,稳定但是实时性低。

4.判断nil

接口有类型和实值两种,只有类型和实际值都是nil,接口变量才等于nil。

一般类型不会有值和类型不一致,只需值为nil即可算成nil。

5.select语句特性

Go 语言 select 语句 | 菜鸟教程 (runoob.com)

select 是 Go 中的一个控制结构,类似于 switch 语句。

select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收

select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块

如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。

6包package定义

包(pkg)是 Go ⼯作区中包含 Go 源⽂件或其他包的⽬录。源⽂件中的每个函数、变量和类型都存储在链接包中。每个 Go 源⽂件都属于⼀个包

7.字符串拼接

8.字符串转成byte数组,会发⽣内存拷⻉吗?

golang面试题:字符串转成byte数组,会发生内存拷贝吗? (qq.com)

一般强转都会拷贝,除非调用unsafe包的方法

 9.拷⻉⼤切⽚⼀定⽐⼩切⽚代价⼤吗

一样,因为slice的结构都是两个int一个uintptr指针

10.json包变量不加tag会怎么样

有tag用tag,没有就按原来的。小写私有字段会忽略序列化。

11.​reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag

可以用reflect获取其type,然后调用get(json)获取其json标签,见链接

golang面试题:​reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag? (qq.com)

12.for range的循环次数

昨天那个在for循环里append元素的同事,今天还在么? (qq.com)

次数取决于开始循环时候的len,之后不会重新计算,所以不会因为遍历目标长度改变而死循环。

for i ,len(s),i++ 这种每次都重新计算len所以可能死循环。

因此for range适合与读取正在push和pop的管道。

13.struct比较

相同类型的可以比较,不同类型不可比。

相同类型中字段如有不能比较的,结构体也不能比较。

只有同类型且字段都可以比较的结构体才可以

Go | struct 的比较_如何比较两个struct相不相等_CnPeng的博客-CSDN博客

14.显示类型转换

 

15.协程Goroutine和线程区别

从调度上看,goroutine的调度开销远远⼩于线程调度开销。
OS的线程由OS内核调度,每隔⼏毫秒,⼀个硬件时钟中断发到CPU,CPU调⽤⼀个调度器内核函数。这个函数暂停当前正在运⾏的线程,把他的寄存器信息保存到内存中,查看线程列表并决定接下来运⾏哪⼀个线程,再从内存中恢复线程的注册表信息,最后继续执⾏选中的线程。这种线程切换需要⼀个完整的上下⽂切换:即保存⼀个线程的状态到内存,再恢复另外⼀个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。

Go运⾏的时候包涵⼀个⾃⼰的调度器,这个调度器使⽤⼀个称为⼀个M:N调度技术,m个goroutine到n个os线程(可以⽤GOMAXPROCS来控制n的数量),Go的调度器不是由硬件时钟来定期触发的,⽽是由特定的go语⾔结构来触发的,他不需要切换到内核语境,所以调度⼀个goroutine⽐调度⼀个线程的成本低很多。从栈空间上,goroutine的栈空间更加动态灵活。每个OS的线程都有⼀个固定⼤⼩的栈内存,通常是2MB,栈内存⽤于保存在其他函数调⽤期间哪些正在执⾏或者临时暂停的函数的局部变量。这个固定的栈⼤⼩,如果对于goroutine来说,可能是⼀种巨⼤的浪费。作为对⽐goroutine在⽣命周期开始只有⼀个很⼩的栈,典型情况是2KB, 在go程序中,⼀次创建⼗万左右的goroutine也不罕⻅(2KB*100,000=200MB)。⽽且goroutine的栈不是固定⼤⼩,它可以按需增⼤和缩⼩,最⼤限制可以到1GB。
goroutine没有⼀个特定的标识。
在⼤部分⽀持多线程的操作系统和编程语⾔中,线程有⼀个独特的标识,通常是⼀个整数或者指针,这个特性可以让我们构建⼀个线程的局部存储,本质是⼀个全局的map,以线程的标识作为键,这样每个线程可以独⽴使⽤这个map存储和获取值,不受其他线程⼲扰。
goroutine中没有可供程序员访问的标识,原因是⼀种纯函数的理念,不希望滥⽤线程局部存储导致⼀个不健康的超距作⽤,即函数的⾏为不仅取决于它的参数,还取决于运⾏它的线程标识。

16.切片比较

第二行不知为何对,待解惑

我猜是先进行类型比较然后再进行内容比较,类型不一样直接false了?

go的比较_go 比较_~kiss~的博客-CSDN博客

Go 学习笔记(89) — 接口类型变量的等值比较操作(nil 接口变量、空接口类型变量、非空接口类型变量)_golang 动态类型 是否为nil_wohu007的博客-CSDN博客

17.协程是什么,如何停止?

协程由程序控制,是一种特殊函数,可以挂起或者继续运行。一个线程的多个协程是串行的,同时只能执行一个协程。

golang 终止 goroutine - Mr.peter - 博客园 (cnblogs.com)

1.手动调用 runtime.Goexit() 来手动终止协程

2.用for-range退出,一直读取chan,只有当chan关闭且读完之后才会退出,chan不关闭会阻塞

3.for-select可以同时处理多个chan

4.设置一个状态通道stop专门给所有协程发送关闭信息

18.除了加Mutex锁以外还有哪些⽅式安全读写共享变量

Golang中Goroutine 可以通过 Channel 进⾏安全读写共享变量。

19.chan同步

20.switch

21.  ADD

AC正确

func Test54(t *testing.T) {var a Integer = 1var b Integer = 2var i interface{} = &asum := i.(*Integer).Add(b)fmt.Println(sum)
}
A.
type Integer int
func (a Integer) Add(b Integer) Integer {return a + b
}
B.
type Integer int
func (a Integer) Add(b *Integer) Integer {return a + *b
}
C.
type Integer int
func (a *Integer) Add(b Integer) Integer {return *a + b
}
D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {return *a + *b
}

Go面试:面试题笔记整理(一)_对于局部变量整型切片x的赋值,下面定义正确的是()_pengpengzhou的博客-CSDN博客

关键在于b,b作为方法参数是必须类型对应的,不能传指针 

对于方法的参数而言,指针类型的参数不能接受值类型的参数,反之亦然,所以BD是错的。而对于结构体的方法而言,不论定义成值方法或者指针方法,都可以同时支持用指针或者非指针实例来调用。

22.Go的bool

go不支持int和bool的强转和cpp不一样

23.go语⾔的并发机制以及MPG模型

Goroutine 是Golang实际并发执⾏的实体,它底层是使⽤协程(coroutine)实现并发,coroutine是⼀种运⾏在⽤户
态的⽤户线程,类似于 greenthread,go底层选择使⽤coroutine的出发点是因为,它具有以下特点:

⽤户空间 避免了内核态和⽤户态的切换导致的成本。
可以由语⾔和框架层进⾏调度。
更⼩的栈空间允许创建⼤量的实例

MPG:

Golang内部有三个对象: P对象(processor) 代表上下⽂(或者可以认为是cpu核心),M(work thread)代表⼯作线程,G对象(goroutine).

正常情况下⼀个cpu对象启⼀个⼯作线程对象,线程去检查并执⾏goroutine对象。碰到goroutine对象阻塞的时候,会启动⼀个新的⼯作线程,以充分利⽤cpu资源。 所有有时候线程对象会⽐处理器对象多很多.

在单核情况下,所有Goroutine运⾏在同⼀个线程(M0)中,每⼀个线程维护⼀个上下⽂(P),任何时刻,⼀个
上下⽂中只有⼀个Goroutine,其他Goroutine在runqueue中等待。
⼀个Goroutine运⾏完⾃⼰的时间⽚后,让出上下⽂,⾃⼰回到runqueue中(如下图所示)。
当正在运⾏的G0阻塞的时候(可以需要IO),会再创建⼀个线程(M1),P转到新的线程中去运⾏。

 

24.并发控制模型

1.channel通知实现并发控制

无缓冲通道能实现并发控制,控制读写同步,否则阻塞。

当主 goroutine 运⾏到 <-ch 接受 channel 的值的时候,如果该 channel 中没有数据,就会⼀直阻塞等待,直到有值。 这样就可以简单实现并发控制。

2.通过sync包中的WaitGroup实现并发控制

深入理解 go sync.Waitgroup - 掘金 (juejin.cn)

Goroutine是异步执⾏的,有的时候为了防⽌在结束mian函数的时候结束掉Goroutine,所以需要同步等待,这个时候就需要⽤ WaitGroup了,在 sync 包中,提供了 WaitGroup ,它会等待它收集的所有 goroutine 任务全部完成。在WaitGroup⾥主要有三个⽅法:

1)Add, 可以添加或减少 goroutine的数量.
2)Done, 相当于Add(-1).
3)Wait, 执⾏后会堵塞主线程,直到WaitGroup ⾥的值减⾄0.主线程等所有协程结束才继续运行

3.上下文Context

Context是包括⼀个程序的运⾏环境、现场和快照等。每个程序要运⾏时,都需要知道当前程序的运⾏状态,通常Go 将这些封装在⼀个 Context ⾥,再将它传给要执⾏的 goroutine 。

context 包主要是⽤来处理多个 goroutine 之间共享数据,及多个 goroutine 的管理。

 

25.协程,线程,进程的区别

26.

相关文章:

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…...

zabbix监控H3C设备

背景 常见的服务和主机已经使用Prometheus进行监控了&#xff0c;但是网络设备还未配置监控。使用基于SNMP对网络设备进行监控。 设备概览 主要类型为H3C的路由器和交换机。 H3CS5560交换机 路由器MER5200 er8300 一台群晖的NAS服务 步骤 配置网络设备开启telnet远程&…...

国产化改造之Mysql迁移方案:Mysql Galera Cluster

一、背景 因某业务系统OS国产化改造&#xff0c;现需将生成环境Mysql 主从迁移到新部署的BCLinux OS主机上&#xff1b;如果保障业务不断&#xff0c;平滑迁移并成功割接将是本次方案的重要方向&#xff0c;现场环境涉及需迁移数据780G左右&#xff0c;目标主机OS版本&#xff…...

bootstrap表单类型

1.基本格式 <form><div class"form-group"><label>电子邮件</label><input type"email" class"form-control" placeholder"请输入你的电子邮件" /></div><div class"form-group"&g…...

第一章 SQL Server 数据库部署

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…...

赛事个人团体报名分组成绩查询证书h5小程序开源版开发

赛事个人团体报名分组成绩查询证书h5小程序开源版开发 以下是赛事个人团体报名分组成绩查询证书H5小程序的功能列表&#xff1a; 用户注册和登录&#xff1a;用户可以通过注册和登录功能创建账号或使用已有账号登录小程序。 赛事信息浏览&#xff1a;用户可以浏览小程序中提供…...

【大数据环境配置】01-安装VMware虚拟机

一、VMware的安装 1&#xff1a; 运行“VMware_workstation_full_12.5.2.exe”&#xff08;或者其他版本&#xff09; 2&#xff1a;引导页面&#xff0c;直接点击下一步 3&#xff1a; 同意许可&#xff0c;然后继续点击下一步 4&#xff1a; 选择VMware安装位置&#xff0…...

什么是C语言中的命名空间?

C语言本身并没有像某些其他编程语言&#xff08;如C&#xff09;中的显式命名空间&#xff08;namespace&#xff09;的概念&#xff0c;但C语言中有一些机制和约定&#xff0c;允许开发人员组织和管理变量、函数和其他标识符的名称&#xff0c;以避免名称冲突和提高代码可维护…...

Java语言特点 8种基本数据类型 标识符等练习题 插入/希尔/选择/堆/冒泡/快速/归并/计数排序

&#xff08;单选题&#xff09;java 的字符类型采用的是 Unicode编码方案&#xff0c;每个 Unicode码占用&#xff08; &#xff09;个比特位。 题目内容&#xff1a; A .8 B .16 C .32 D .64 &#xff08;单选题&#xff09;下列说法不正确的是&#xff08; &#xff0…...

建站系列(七)--- 常用前后端框架

目录 相关系列文章前言一、何为框架&#xff1f;二、为什么使用框架三、常用框架&#xff08;一&#xff09;Bootstrap&#xff08;二&#xff09;Layui&#xff08;三&#xff09;JQuery&#xff08;四&#xff09;Vue.js&#xff08;四&#xff09;ThinkPHP&#xff08;五&am…...

Jmx协议远程连接java服务器

注意&#xff1a;本例里&#xff0c;我用的是jdk17 通常用jdk自带的jconsole&#xff0c;或者想要功能强大点的使用visualVM 需要java服务器在启动的时候加上以下参数 -Dcom.sun.management.jmxremote 启用jxm远程连接-Djava.rmi.server.hostname10.1.3.99 指定jxm监听地址&…...

consul 概念 键值对操作命令

传统配置文件的弊端 静态化配置&#xff0c;例如env文件配置文件无法区分环境配置文件过于分散历史版本无法查看 配置中心如何解决的呢?配置中心的思路是把项目中的配置参数全部放在一个集中的地方来管理&#xff0c;并提供一套标准的接口&#xff0c;当各个服务需要获取配置…...

R拒绝访问的解决方案

Win11系统 安装rms的时候报错&#xff1a; Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck vI[[j]]) : namespace Matrix 1.5-4.1 is already loaded, but > 1.6.0 is required## 安装rms的时候报错&#xff0c;显示Matrix的版本太低…...

SeaArt.ai: 海艺AI绘画艺术图片模型创作平台

【产品介绍】 • 名称 SeaArt.ai • 具体描述 SeaArt.ai是一个基于人工智能技术的AI绘画工具&#xff0c;它可以根据你的描述或者关键词来生成符合你想象的图片。你可以选择不同的模式来创建不同类型的图片&#xff0c;比如人物、风景、建筑、神话、自…...

服务器数据恢复-Xen server虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌服务器通过一张同品牌某型号RAID卡将4块STAT硬盘组建为一组RAID10阵列。上层部署Xen Server虚拟化平台&#xff0c;虚拟机上安装的是Windows Server操作系统&#xff0c;包括系统盘 数据盘两个虚拟机磁盘&#xff0c;作为Web服务器使…...

电工-PN结的工作原理

如果将PN结加正向电压&#xff0c;即P区接正极&#xff0c;N区接负极&#xff0c;如右图所示。由于外加电压的电场方向和PN结内电场方向相反。在外电场的作用下&#xff0c;内电场将会被削弱&#xff0c;使得阻挡层变窄&#xff0c;扩散运动因此增强。这样多数载流子将在外电场…...

C#教学辅助系统网站as.net+sqlserver

本教学辅助系统系统从两种用户角度进行功能划分。 1、学生部分&#xff1a; 1.1&#xff1a;新闻查看&#xff1b; 1.2&#xff1a;课程公告查看&#xff1b; 1.3&#xff1a;用户注册&#xff1b; 1.4&#xff1a;在线留言&#xff1b; 1.5&#xff1a;资料下载&#xff1b; …...

Selenium - Tracy 小笔记2

selenium本身是一个自动化测试工具。 它可以让python代码调用浏览器。并获取到浏览器中加们可以利用selenium提供的各项功能。帮助我们完成数据的抓取。它容易被网站识别到&#xff0c;所以有些网站爬不到。 它没有逻辑&#xff0c;只有相应的函数&#xff0c;直接搜索即可 …...

SVN 和 GIT 命令对比

参考 https://blog.csdn.net/justry_deng/article/details/82259470 # TortoiseSVN打分支、合并分支、切换分支 https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/ # 版本控制&#xff1a;Git与Svn的命令对应关系 TortoiseSVN打分支、合并分支、切换…...

LeetCode 之 移除元素

算法模拟&#xff1a; Algorithm Visualizer 在线工具&#xff1a; C 在线工具 如果习惯性使用Visual Studio Code进行编译运行&#xff0c;需要C11特性的支持&#xff0c;可参考博客&#xff1a; VisualStudio Code 支持C11插件配置 问题1&#xff1a;LeetCode 27.移除元素…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...