RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
go语言中伪随机的意思 go语言随机数

进大厂系列02

想进大厂,但不知道该如何入手,不妨从先过八股文的题量开始,比如先过个50题,然后一边面,一边学,进大厂就只不过是时间问题了,加油打工人!

我们提供的服务有:网站制作、网站设计、微信公众号开发、网站优化、网站认证、古丈ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的古丈网站制作公司

本篇一共10题,大概花20分钟阅读。

1.golang的switch语句有什么特点?

switch关键字是通过对比key和case后面的value来选择需要执行的语句,与其他语言比如php和java不同的是,golang的switch默认不会去执行下一个case的语句,除非你显示的添加了一行fallthough关键字。

2.golang的select当有多个goroutine准备就绪,它是如何选择的?

select语句是用来处理与channel IO相关的逻辑,当有多个channel准备就绪的时候,其是伪随机选择一个goroutine来接收,然后执行相关的语句块。

Note: select关键字常用于和goroutine超时相关的逻辑设计。

3.golang什么时候会panic?

这里总结了8种,应付面试官应该是够了

4.子协程出现panic能在父协程使用recover()捕获吗?

不能,只能在子协程内部使用recover()捕获panic,协程只能捕获自己的panic。

5.什么样的panic不可恢复

6.defer函数的执行顺序是怎么样的?

7.unsafe.Pointer和uintptr是用来干什么的呢?

在golang中,为了安全性,是不允许指针像C++那样进行类型转换以及计算的,但是有些场景又必须要这么做怎么办呢?于是出现了unsafe.Pointer用于指针类型转换,比如*int64可以转换为*int64,出现了uintptr用于指针运算。

对于unsafe.Point有以下几点性质:

uintptr官方的定义是

其是用来做指针运算的

Note:

第三行的目的是为了获取age属性,age属性在stuct中处于第二列,首先是把student转换成unsafe.Point,获取指向student的指针,然后再转换成uintptr进行指针运算,然后通过unsafe.offset获取student.age相对于student的偏移量加上student的起始地址就能获得student.age的起始地址,然后转换成*int类型,就可以读取age属性了。

8.常用unsafe.Point和uintptr做什么呢,这么做有什么好处呢?

unsafe.Point常用于操作结构体的私有变量,以及类型转换。

好处就是golang中只有unsafe.Point能做到这个事,其他方法都做不到,反射的底层也是用unsafe.Point做的。

9.unsafe.Point和unintptr有什么坑呢?

千万要小心,不要为uintptr起一个中间变量 ,例如这样:

这是因为当发生gc的时候,可能会修改变量的内存地址,同时也会修改指向该变量的指针指向新的地址。但是uintptr是一个整数,其不是一个指针,因此在gc修改变量的时候,可不会修改它的值,他还指向原来的地址,然后转化成unsafe.Point进行操作,当然会报错。

10. string转byte的零拷贝技术

string在golang中的的存储结构为:

我们可以定义一个一样的结构体,然后用unsafe.Point把其转化成我们定义结构体,这样就可以把其私有属性,映射成共有属性了。

这个结构体golang已经帮我们定义好了,如下:

同理,slice的存储结构可以映射成,如下结构体,golang也已经帮我们定义好了

接来下就是具体的代码:

其实就是修改了一下byte切片data所指向的地址空间以及len就行了。

参考资料:

unsafe.Point

伪随机是什么意思?

现在的计算机还无法产生一个真正的随机数,它能产生的随机数都是伪随机数,在这方面它跟人脑还没法比,但是它有强大的计算功能,可以通过复杂的计算弥补这一缺点。 存在一个基本的随机率m,被的随机率都以m和固有概率共同计算,如网络游戏中攻击力的浮动,装备的精炼。m=f(t)是时间t的函数,t至少精确到0.01秒。t还是一个周期较大的周期函数.因为计算机是结构,条理非常清晰的数理逻辑. 它所执行的东西都是按照人们编好的程序一步一步来的. 所以这并不是真正的随机.举个例子来说,你玩过网游吧,一般的游戏里都有本地图内随机传送的技能或物品. 如果真随机的话,你无限次传送可以到达任何一个地方. 但如果伪随机的话,无限次传送之后有些地方仍然是无法到达的。 计算机通过复杂得计算,让大家看起来好像是数据之类的东西是处于随机状态的,但是他还是有一定的规律。真正的随机,没办法预测下一步。

计算机语言中,随机函数原理是什么?

计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。 伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。

随机函数有如下两种:

rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。

srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。

Golang标准库——math

返回x和y中最大值,特例如下:

返回x和y中最小值,特例如下:

返回一个标准化小数frac和2的整型指数exp,满足f == frac * 2**exp,且0.5 = Abs(frac) 1;特例如下:

第一类贝塞尔函数,n阶。特例如下:

MaxBase是字符串转换函数接受的最大进制。

创建一个值为x的*Int。

将z设为-x并返回z。

返回一个uint32类型的非负的32位伪随机数。

返回一个取值范围在[0,n)的伪随机int值,如果n=0会panic。


网站标题:go语言中伪随机的意思 go语言随机数
标题链接:http://cqwzjz.cn/article/hichei.html