当前位置: 首页 > 科技观察

这三道围棋级别的自测题,手写不行就老老实实去上班_0

时间:2023-03-19 16:25:14 科技观察

现在技术文章量很大,分析的都头头是道,但是是否分析是否正确取决于作者的水平,很可能是一个错误,而抄袭他的人也是错误的,因为我以前看源码的时候经常觉得自己在两种状态之间切换:我明白了/我妈记错了,这个功能是做什么的。八股文其实是对面试官的一种特殊考验。如果你一味地问八股文,那只能说你正好比面试官看的八股文多,并不能说明你有多优秀。面试官也可以。最近和一个过去的老同事聊天,他说了一个他特别喜欢问的面试问题。我觉得挺好的。既能引导考生循序渐进地发展思维,又能考查基础知识和动手能力。PS:我哥是1983年的,以前在广告平台公司工作,会C++、Java、Android。他以前是我的领导。构建该项目的人强迫我学习Go。老哥说:一开始引起Go关注的不就是并发和Channel吗?其实你用过之后,就会发现原来如此。Concurrency和Channel都被查了?我一般会问:“你精通Channel和并发吗(一般不会有人说你不熟悉)那我们先用Channel实现一个mutex吧。”嘿,那你呢,让我们实施吧。心想这道题面试别人用过,背下来了。。。还是难倒我:先初始化一个Channel,容量等于1,它的“空槽”代表锁。哪个协程能成功发送元素当你来到这个Channel,谁拿到锁就给你代码://使用chan实现一个mutextypeMutexstruct{chchanstruct{}}//要使用锁,你需要初始化funcNewMutex()*Mutex{mu:=&Mutex{make(chanstruct{},1)}mu.ch<-struct{}{}returnmu}//请求锁直到func(m*Mutex)Lock(){<-m.ch}//Unlockfunc(m*Mutex)Unlock(){select{casem.ch<-struct{}{}:default:panic("unlockofunlockedmutex")}}我的哥说:只要不是太迷惑,这个问题如果你能回答所有问题,那我一般会在这个问题的基础上做两个变体。首先让候选人展开,实现这个锁的TryLock函数。TryLock知道,你已经写了两年Java,这个已经用过了,你可以在刚才的基础上实现。心想:我现在偶尔写Java的时候,都是把以前做的项目的代码照搬过来的。怎么记得这么清楚,不过这只是尝试获取锁,获取不到就返回false。这里我再给大家讲解一下TryLock的作用。我从JavaDoc中复制了以下段落:tryLock()-可以轮询锁。成功返回真;失败时为假。也就是说,这个方法无论成功还是失败都会立即返回,如果无法获取到锁(锁已经被其他线程获取到),则不会一直等待下去。那么这对我来说不是问题。我们在学习Channel的时候一定要学会使用select+chan+default的方式来避免程序阻塞,所以我会用到这个公式。(不过我一直不写这个,语法忘记了,多亏GoLand提醒了我好久,我写出来了,面试的时候一般都是写在纸上的,我们读者记得贝贝哈)//trytoacquirethelockfunc(m*Mutex)TryLock()bool{select{case<-m.ch:returntruedefault:}returnfalse}师兄:嗯,确实是这样的方案,但是你写的太慢了,算了,其实我估计直接写不出来,天天开会手生。嗯,如果这个变体能答出来,就证明候选人的基础应该没问题,使用这个通道应该没有问题。那我这会儿展开一下,让考生实现TryLock的重载方法是设置超时时间的重载函数,考查他对定时器的了解,但是哎,我是怎么说出答案的,你懂的我是说。小弟的意思是实现TryWithTimeout。Java中的TryLock还有一个重载方法:tryLock(long,TimeUnit)——可以定时获取锁。与tryLock()类似,唯一不同的是,该方法在无法获取到锁时会等待一定时间,如果在限定时间内无法获取到锁,则返回false。如果锁是最初获取的或在等待期间获取的,则返回true。因为Go中没有重载方法的机制,所以我们只能写一个TryWithTimeout方法。刚才说了可以用定时器实现,具体怎么用忘记了。。。只好打开浏览器默默搜索,最后实现答案版如下://addatimeoutsettingfunc(m*Mutex)LockTimeout(timeouttime.Duration)bool{timer:=time.NewTimer(timeout)select{case<-m.ch:timer.stop()returntruecase<-timer.C:}returnfalse}最后小弟看了一眼:嗯,好像是这样。一家之主今日有事。放学后还要去接二公主。下次再说吧。通常在实际应用中最好不要使用Channel代替sync.Mutex,但是使用Channel除了互斥锁的功能外,确实可以扩展TryLocK和LockTimeout的扩展功能。使用select+chan+defualt的方式,很容易实现TryLock和TryLockWithTimeout的功能。具体来说,在select语句中,我们可以使用default来实现TryLock,并添加一个Timer来实现Timeout的功能。