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.

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

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

相关文章

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …

图的学习,深度和广度遍历

一、什么是图 表示“多对多”的关系 包括&#xff1a; 一组顶点&#xff1a;通常用V&#xff08;Vertex&#xff09;表示顶点集合一组边&#xff1a;通常用E&#xff08;Edge&#xff09;表示边的集合 边是顶点对&#xff1a;(v, w)∈E&#xff0c;其中v,w∈V有向边<v, w&…

go开发之个微机器人的二次开发

简要描述&#xff1a; 设置某条朋友圈为隐私 请求URL&#xff1a; http://域名地址/snsSetAsPrivacy 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名…

CFTC可能比SEC更可怕,将监管炮口直接对准DeFi?

还未开始享受Uniswap在法庭上为DeFi行业带来的“胜利果实”&#xff0c;美国商品期货委员会&#xff08;CFTC&#xff09;在一个星期之后立即将其无情砸碎&#xff0c;并将其监管大炮直接对准了DeFi衍生品市场&#xff0c;乃至整个DeFi行业。 2023年9月7日&#xff0c;CFTC宣布…

leetcode 215.数组中第k大的元素

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;数组中第k大的元素 思路&#xff1a; 使用堆数据结构&#xff0c;大堆的堆顶是堆内最大的元素&#xff0c;也就是把当前堆 pop k - 1 次&#xff0c;第 k 次 top 出来的元素就是第 k 大的数。 代码&#xff1a; class …

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

职场新人对测试用例的困惑

职场新人对测试用例的困惑无非有以下几点&#xff1a; 什么是测试用例&#xff0c;为什么要写测试用例&#xff1f; 不知道怎么写&#xff0c;写了也不知道写的是否完整。 一、什么是测试用例&#xff1f; 百科的释义&#xff1a; 测试用例是对一项特定的软件产品进行测试任…

【CSS系列】writing-mode —— 文字方向(水平/垂直;左右/右左)

文章目录 一、引子二、writing-mode1.语法horizontal-tb&#xff08;默认&#xff1a;水平方向&#xff0c;文字 从左到右&#xff0c;行 从上到下&#xff09;vertical-rl&#xff08;垂直方向&#xff0c;文字 从上到下&#xff0c;行 从右到左&#xff09;vertical-lr&#…

数字化转型背景下企业知识管理能力提升路径

近年来&#xff0c;科技不断进步&#xff0c;颠覆性技术&#xff08;例如 5G、云计算、物联网、大数据分析和人工智能等&#xff09;正在重新定义企业如何管理项目和运营效率。知识管理体系亦需要随着科技的进步而改变&#xff0c;以适应新的数字时代环境&#xff0c;并且高效知…

SpringMVC的简介及工作流程

一.简介 Spring MVC是一个基于Java的开发框架&#xff0c;用于构建灵活且功能强大的Web应用程序。它是Spring Framework的一部分&#xff0c;提供了一种模型-视图-控制器&#xff08;Model-View-Controller&#xff0c;MVC&#xff09;的设计模式&#xff0c;用于组织和管理Web…

微信小程序Day2笔记

1、WXML模板语法 1. 数据绑定 数据绑定的基本原则 在data中定义数据在WXML中使用数据 2. 在data中定义页面的数据 在页面对应的.js文件中&#xff0c;把数据定义到data对象中。 3. Mustache语法的格式 把data中的数据绑定到页面中渲染&#xff0c;使用Mustache语法&…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

【算法】二分查找算法——leetcode二分查找、搜索插入位置

文章目录 二分查找704. 二分查找35. 搜索插入位置 二分查找 二分查找算法是一种在有序数组中查找特定元素的搜索算法。算法的工作原理是&#xff0c;通过比较数组中间元素和目标值&#xff0c;如果目标值等于中间元素&#xff0c;那么查找结束。如果目标值小于或大于中间元素&a…

Linux驱动【day2】

mychrdev.c: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h" unsigned int major; // 保存主设备号 char kbuf[128]{0}; unsigned int…

产品波士顿矩阵

随着公司产品的增多&#xff0c;每个产品的生命周期节点各不相同&#xff0c;很多时候我们往往在产品结构、资源分配方面会产生各种问题&#xff0c;导致需要发展的产品得不到资源&#xff0c;消耗资源的产品却有无法增长&#xff0c;所谓不聚焦导致的问题其实是资源和发展错配…

ETCD详解

一、etcd概念 ETCD 是一个高可用的分布式键值key-value数据库&#xff0c;可用于服务发现。 ETCD 采用raft 一致性算法&#xff0c;基于 Go语言实现。 etcd作为一个高可用键值存储系统&#xff0c;天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票&…

编程中的信号处理和系统 - 初学者指南

信号处理是工程和编程的一个重要领域。 基本上,它允许工程师和程序员改进数据,以便人们可以更有效地使用它。 例如,由于信号处理,电话中的大部分背景噪音都被消除了。这样,通话的另一端就只能听到您的声音。 其他例子有: 音频和音乐软件图像视频处理软件医学影像软件语…

Modelsim仿真问题解疑二:ERROR: [USF-ModelSim-70]

现象&#xff1a;在Vivado中已配置modelsim为仿真工具后&#xff0c;运行仿真&#xff0c;报错USF-ModelSim-70和ERROR: [Vivado 12-4473] 详细报错内容如下 ERROR: [USF-ModelSim-70] compile step failed with error(s) while executing C:/Users/ZYP_PC/Desktop/verilog_t…