avatar呸呸創作

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

3474

Abstract

w <code>SafeMap</code>.</li></ul><h1 id="f98e">Step 4: Set Method</h1><p id="a46c">Now, let’s create a method to set key-value pairs in our map. Add this code to the <code>SafeMap</code> struct:</p><div id="3d52"><pre><span class="hljs-comment">// Set sets a key-value pair in the map.</span> <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(m *SafeMap)</span></span> Set(key <span class="hljs-type">string</span>, value <span class="hljs-type">int</span>) { m.mu.Lock() <span class="hljs-keyword">defer</span> m.mu.Unlock() m.data[key] = value }</pre></div><ul><li>We define a method called <code>Set</code> that takes a key and a value as parameters.</li><li><code>m.mu.Lock()</code> locks the mutex to ensure exclusive access to the map.</li><li>We use <code>defer</code> to ensure that the mutex is unlocked even if an error occurs or the function returns.</li><li>Finally, we set the key-value pair in the map.</li></ul><h1 id="a568">Step 5: Get Method</h1><p id="cefd">Let’s create a method to retrieve values based on keys. Add this code:</p><div id="2071"><pre><span class="hljs-comment">// Get retrieves the value associated with a key.</span> <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(m *SafeMap)</span></span> Get(key <span class="hljs-type">string</span>) (<span class="hljs-type">int</span>, <span class="hljs-type">bool</span>) { m.mu.Lock() <span class="hljs-keyword">defer</span> m.mu.Unlock() val, ok := m.data[key] <span class="hljs-keyword">return</span> val, ok }</pre></div><ul><li>We define a method called <code>Get</code> that takes a key as a parameter and returns both the value and a boolean indicating if the key exists.</li><li>We lock the mutex, retrieve the value from the map, and unlock the mutex before returning the result.</li></ul><h1 id="9e28">Step 6: Delete Method</h1><p id="1411">To delete key-value pairs, add the following code:</p><div id="569d"><pre><span class="hljs-comment">// Delete removes a key-value pair from the map.</span> func (m *SafeMap) <span class="hljs-built_in">Delete</span>(key string) { m<span class="hljs-selector-class">.mu</span><span class="hljs-selector-class">.Lock</span>() defer m<span class="hljs-selector-class">.mu</span><span class="hljs-selector-class">.Unlock</span>() <span class="hljs-built_in">delete</span>(m.data, key) }</pre></div><ul><li>We define a method called <code>Delete</code> that removes a key-value pair based on the provided key.</li><li>Similar to other methods, we lock the mutex, perform the deletion, and unlock the mutex.</li></ul><h1 id="e8e5">Step 7: Size Method</h1><p id="13e9">Let’s create a method to determine the size of the map:</p><div id="f476"><pre><span class="hljs-comment">// Size returns the number of key-value pairs in the map.</span> func (m *SafeMap) <span class="hljs-built_in">Size</span>() int { m<span class="hljs-selector-class">.mu</span><span class="hljs-selector-class">.Lock</span>() defer m<span class="hljs-selector-class">.mu</span><span class="hljs-selector-class">.Unlock</span>() return <span class="hljs-built_in">len</span>(m.data) }</pre></div><ul><li>We define a method called <code>Size</code> that returns the number of key-value pairs in the map.</li><li>As with other methods, we lock the mutex, obtain the size, and unlock the mutex.</li></ul><h1 id="4996">Step 8: Putting It All Together</h1><p id="4eee">Now that we’v

Options

e defined our custom thread-safe map, let’s put it to use:</p><div id="327a"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> { <span class="hljs-comment">// Create a new thread-safe map.</span> safeMap := NewSafeMap()

<span class="hljs-comment">// Set key-value pairs concurrently.</span> wg := sync.WaitGroup{} <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i < <span class="hljs-number">100</span>; i++ { wg.Add(<span class="hljs-number">1</span>) <span class="hljs-keyword">go</span> <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(i <span class="hljs-type">int</span>)</span></span> { <span class="hljs-keyword">defer</span> wg.Done() key := fmt.Sprintf(<span class="hljs-string">"key%d"</span>, i) safeMap.Set(key, i) }(i) } wg.Wait()

<span class="hljs-comment">// Get and print values concurrently.</span> <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i < <span class="hljs-number">100</span>; i++ { wg.Add(<span class="hljs-number">1</span>) <span class="hljs-keyword">go</span> <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(i <span class="hljs-type">int</span>)</span></span> { <span class="hljs-keyword">defer</span> wg.Done() key := fmt.Sprintf(<span class="hljs-string">"key%d"</span>, i) val, ok := safeMap.Get(key) <span class="hljs-keyword">if</span> ok { fmt.Printf(<span class="hljs-string">"Key: %s, Value: %d\n"</span>, key, val) } <span class="hljs-keyword">else</span> { fmt.Printf(<span class="hljs-string">"Key: %s not found\n"</span>, key) } }(i) } wg.Wait()

<span class="hljs-comment">// Delete keys concurrently.</span> <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i < <span class="hljs-number">50</span>; i++ { wg.Add(<span class="hljs-number">1</span>) <span class="hljs-keyword">go</span> <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(i <span class="hljs-type">int</span>)</span></span> { <span class="hljs-keyword">defer</span> wg.Done() key := fmt.Sprintf(<span class="hljs-string">"key%d"</span>, i) safeMap.Delete(key) }(i) } wg.Wait()

<span class="hljs-comment">// Print the final size of the map.</span> size := safeMap.Size() fmt.Printf(<span class="hljs-string">"Map size: %d\n"</span>, size) }</pre></div><ul><li>In the <code>main</code> function, we create an instance of our <code>SafeMap</code>.</li><li>We set key-value pairs concurrently using goroutines.</li><li>We retrieve and print values concurrently.</li><li>We delete keys concurrently.</li><li>Finally, we print the size of the map.</li></ul><h1 id="d1df">Conclusion</h1><p id="c100">You’ve just created a custom thread-safe map in Go! This example demonstrates the basics of using mutexes to protect concurrent access to data structures. Understanding these concepts is crucial for building reliable concurrent programs in Go.</p><p id="2e1d">Feel free to explore my repository at <a href="https://github.com/parv-jain/thread-safe-data-structures">https://github.com/parv-jain/thread-safe-data-structures</a> where I plan to delve deeper into and experiment with the implementation of thread-safe data structures in Go.</p></article></body>

依親移民台灣(三) — 從香港到台灣的求職之路

十二月初來到台灣定居,終於在苦尋一個半月後,收到人力銀行通知「 恭喜您已通過面試,正式錄取為OOOOOO有限公司的一份子!」當下的感概難以形容。

事先聲明,我只是一個非常非常普通的香港女生,那些名大學畢業、專門學系畢業、豐富專業工作高手經歷一切不在本文探討範圍,而且本文乃針對台灣南部的就業環境。

尋找工作的途徑

要在台灣找工作,來來去去就是那幾個數字的人力銀行,獵頭公司也有好幾家,可是提供的工作絕大部份都是在北部,南部的文職工作少之又少。台灣的人力銀行比香港做得更出色,這可以歸功於台灣人力銀行的壟斷、雇主和市民對於人力銀行的信任,也同樣代表著市民對於保護個資的不重視。台灣再一次刷新了我對於個人私隱的看法,香港普遍對於個人私隱就算不到重視的程度,也不會輕易透露個人資料,特別是在不可信的網絡,你不知道什麼時侯個人私隱就會被立心不良的人拿去盜用,也無法保證政府不會利用你的個人資料來做政治審查之用。來到台灣,大家都只講一個「信」字,把個人資料毫無保留通通往網絡上丟。求職者方便管理個人履歷,雇主也方便尋找相關人才。

除了人力銀行,還有一種求職仲介稱為獵頭公司,可是獵頭公司手頭上的工作絕大部份都是北部的工作,畢竟北部工薪比南部多,佣金多獵頭才有賺頭,導致南部找文職工作再難上加難。原本我的定向是要尋找大公司、大企業的內勤文職工作,可惜絕大部份大公司、大企業的總部都在北部,所以…(嘆氣)…

履歷要求、檢定和證照

人力銀行的系統就是要我們把所有資料都寫上去,除了一般的過往經驗,還要寫上所得薪水。這一切都沒關係,我很Open!可是有一點讓我很傻眼,就是居然要我寫「自傳」,這大概是台灣獨有的就業環境。一開始我把大概一千字自傳寫上去,可是找了快一個月也沒什麼回應,後來我把它改成16頁A4紙長的自傳,把所有有用的證書都往裡面丟,上傳的第二天馬上就有企業邀請面試。原來我寫的自傳企業是真的會拿來看。

在搜尋適合工作的過程中,會發現幾乎所有的工作都有要求一定的檢定和證照。語言類的證照我可以理解,因為在香港也是同樣重視語言方面的證明,而能夠證明自己的語言能力就是去考取一張國際認可(或至少本地認可)的語言證照,我在香港以前考的是雅思(IELTS),台灣雇主普遍要求多益(TOEIC),關於考取多益我之後會再找時間撰文。可是要求考取檢定真是讓我受到很大的衝擊。

我在這次求職經歷感受非常深的是,台灣就業環境與考試有著糖黐豆的關係,黏緊緊的分不開。先講學習,雇主都覺得你大學讀書的科系就等於你未來工作的路向,有非常多的工作是基本要求就是從某個特定學系畢業。其實我也明白,站在雇主角度,當然你從讀書時代就已經花很多年時間去學習工作相關知識,請了你就能馬上工作不用教,多好。可是!為什麼台灣社會要求學生從學生時代、學習時期、吸收各樣豐富知識的海綿期,就要決定好自己未來的路向?這是我非常大的一個疑問。這不就代表著學生一旦錯手選錯了學科,他未來一生都毀了?很不科學。重點是,就算你是從專門學系畢業,薪水也沒高到哪裡去,這公平嗎?

再來是檢定,台灣非常多雇主要求求職者在應徵前就要先具備指定的檢定,後來我從呀貓口中得知,原來台灣有很多學校都會要求學生在畢業前先考取一定檢定才能畢業,就是說,檢定就是畢業的要求。那這個又回歸老問題,上面已經寫了我不重覆。可是新的問題又來了,我作為一個新移民、外來者,在我還沒清楚這家公司是否值得為它服務、這份工作我是否願意成為未來的路向、這個行業是否我願意待下去…之前,我就要先掏錢去考取一堆很實際的工作檢定,而那些檢定都是要讀書學習才能考到的檢定。這不是很奇怪嗎?那萬一我考完之後才發現這行業根本不是我想待下去的呢?

在香港一般都是邊工作邊考取證照、檢定,與台灣的就業環境實在相差太遠,也讓我非常不能理解為什麼會出現這種奇怪的風氣,到底台灣憑什麼要求學生在腦袋還沒發育完全的時侯就要決定自己的人生,憑什麼要求勞工在應徵前就要先具備一大堆連自己都不確定是否值得投資的檢定呢?重點是這一切都只是敲門磚,就算考了工資也沒高到哪裡去。

入鄉隨俗,既然台灣喜歡考試,我就陪你玩。雖然上面滿滿的抱怨,我早就乖乖掏錢報名各種檢定與證照了(摀臉)。

筆試、面試、複試

台灣真的很愛考試。企業非常喜歡在面試前就先弄一大堆筆試,我試過應徵一份工作,先花了三個小時筆試(包括性格測驗、數學題、英文題、邏輯題等等),再花兩個小時聽介紹會,最後沒空額面試。我一開始不懂為什麼身邊的台灣人總會說要「考」哪家公司,經過親身感受後,終於明白雇主要求職者花很多時間心力去「考」進去公司工作,是真的要「考試」的「考」進去工作。我在香港求職從來都只是隨便丟個履歷,約面試,面試也只是隨便聊聊天,重點是看你的學歷、工作經歷、工作能力、個人應對能力反應OK就聘用了,如果是應徵正職員工,那進去直接就是正職員工,如果有試用期的話過了試用期沒什麼特別也會直接轉正。可是台灣呢,居然連試用期過後還要再「考試」才有機會轉正職員工。重點又來了,薪水才那麼一丁點。

休假制度

在香港工作,大家都會覺得香港的勞工制度真的很壓榨,對勞工很不公平,工時長加班又沒補錢,通勤時間長很常塞車,真是打工仔地獄。那現在我可以大聲的說,沒有最地獄只有更地獄。台灣首年的基本年假只有三天。周休六、日在香港很普遍,在台灣南部想朝九晚五周休六、日?開玩笑!有很多工作都只有月休八天,而且還要排休,也不用提台灣的「晚班」文化,人力銀行一堆要求上晚班的工作。台灣勞資法規定工時、加班補錢或補休的規定,老老實實有多少個雇主真的有在遵守,有多少企業打著「責任制」的名號要求員工無償加班,上面這一堆如果要討論的話會沒完沒了,在此就先請各位讀者自己心神意會了。再補充一句,台灣沒有復活節和聖誕節假期喔。

香港人的優勢

在移民來台灣之前,自己一定會覺得香港人定必會有很大的優勢,因為香港大學入學率那麼低,又是半英語環境,光是學歷和英語能力就O打台灣絕大部份人了。不止自己有這個想法,連身邊的家人、台灣的朋友也會這樣想,對不對?這樣想你就大錯特錯了!我可以很肯定的告訴你,除非你在香港就是特定專業人士,而且專業到是台灣很搶手的人才,不然哪怕你在香港哪一所大學畢業、在香港工作經驗有多豐富,你連一個台灣大學畢業新鮮人也不如。

第一,你剛來台灣一張檢定都沒有;第二,你不會台語是要怎樣服務南部顧客及與上司同事溝通;第三,你沒駕照工作上要使喚你很不方便;第四,外藉人士要辦勞保健保還有一大堆針對外藉人士專有的稅務、法規要注意,太麻煩了吧;第五,你在哪一所大學畢業沒什麼特別呀在台灣大學畢業是基本;第六,英語能力強喔,那多益有金色證書嗎?會議可以即時口譯嗎?;第七,你以前在香港工作經驗很豐富,職位高薪水好,那怎麼可能來台灣應徵這麼低工資的工作;…光是以上種種考慮,我是雇主的話還不如請一個台灣本地大學畢業生比較實在。

台灣找工作真的那麼難嗎

說實在,在南部如果不怕體力活,又喜歡面對客戶會一點點台語的話,有非常多的門市前線及業務開發類工作很缺人。可是如果你是像我一樣有點挑工作,希望內勤的、對電腦的文職,又不想排班輪休,想要有固定的工作時間、有一定的休假,安安份份當一個小OL的話,那在南部找工作就需要很大的耐心慢慢找了。像我找了一個半月,說長不長,最後一定能找到工作。台灣這個地方無法保你發財,可是保你不死。

要融入台灣,求職是一個必經的過程,在當中會切身感受到台灣人找不到工作的艱難和找到工作的可貴。經歷過困難的求職路,對得來不易的工作才會百般珍惜。各位新移民/準備移民/考慮移民的香港朋友,加油。

中文
台灣
香港
求職
移民
Recommended from ReadMedium