<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、golang中關于grpc和rest都使用過嗎?grpc相對于rest的優勢是什么?為什么選擇groc? **兩種API架構概述** * grpc:gRPC是RPC框架中的一種,RPC(remote procedure call 遠程過程調用)框架目標就是讓遠程服務調用更加簡單、透明。RPC 框架負責屏蔽底層的傳輸方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二進制)和通信細節。服務調用者可以像調用本地接口一樣調用遠程的服務提供者,而不需要關心底層通信細節和調用過程。RPC是一種設計理念,而gRPC是基于此種設計理念設計的真實框架。 * rest:描述的是在網絡中client和server的一種交互形式;一個架構樣式的網絡系統,指的是一組架構約束條件和原則。 **grpc相對于rest的優勢** gRPC 對接口有嚴格的約束條件,安全性更高,對于高并發的場景更適用 **為什么選擇grpc** * grpc有明確的接口規范和對于流的支持; * RPC 效率更高。RPC使用自定義的 TCP 協議,可以讓請求報文體積更小,或者使用 HTTP2 協議,也可以很好的減少報文的體積,提高傳輸效率。 ## 二、golang里面常用到的技術棧有哪些? 協程、通道、web框架、密碼學等 ## 三、gin框架的好處是什么? * 快速:基于Radix樹的路由,性能非常強大。 * 支持中間件:內置許多中間件,如Logger,Gzip,Authorization等。 * 崩潰恢復:可以捕捉panic引發的程序崩潰,使Web服務可以一直運行。 * JSON驗證:可以驗證請求中JSON數據格式。 * 多種數據渲染方式:支持HTML、JSON、YAML、XML等數據格式的響應。 * 擴展性:非常簡單擴展中間件。 ## 四、無緩沖通道和緩沖通道的區別是什么? * 無緩沖通道,在通道滿了之后就會阻塞所在的goroutine。(需要在其他goroutine中取出該通道中的元素,才能解除它所在通道的阻塞,不然就會一直阻塞下去。) * 緩沖通道,存完了東西可以不取出來,不會阻塞;除非通道被塞滿才會被阻塞 * 緩沖通道相較于無緩沖區的通道在用法上是要靈活一些的,不會出現一次寫入,一次讀完就會堵塞。 ## 五、select的用處是什么? 過select可以監聽channel上的數據流動。 select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。 示例代碼如下: ~~~text select { case <-chan1: // 如果chan1成功讀到數據,則進行該case處理語句 case chan2 <- 1: // 如果成功向chan2寫入數據,則進行該case處理語句 default: // 如果上面都沒有成功,則進入default處理流程 } ~~~ ## 六、defer的用途和使用場景是什么? defer也稱延遲執行 defer作用:可用于捕獲程序異常,在某個方法中,出現異常時,defer可捕獲此異常并進行打印,使用關鍵字defer向函數聲明退出調用,即主函數退出時,defer后的函數才被調用。defer語句的作用是不管程序是否出現異常,均在函數退出時自動執行相關代碼。 ## 七、defer的執行順序是什么? defer語句并不會馬上執行,而是會進入一個棧,函數return前,會按先進后出的順序執行。也說是說最先被定義的defer語句最后執行。 > 注:先進后出的原因是后面定義的函數可能會依賴前面的資源,自然要先執行;否則,如果前面先執行,那后面函數的依賴就沒有 ## 八、defer函數遇到return以后是怎么執行的? 先defer再return,函數執行之后,return返回之前,按照先進后出的順序執行 ## 九、對于進程,線程,協程的理解是什么 * 線程可以理解為輕量級的進程 協程可以理解為輕量級的線程 * 協程最大的優勢就是可以輕松的創建上百萬個,而不會導致系統資源衰減 ## 十、map怎么順序讀取? map不能順序讀取,是因為他是無序的,想要有序讀取,首先的解決的問題就是,把key變為有序,所以可以把key放入切片,對切片進行排序,遍歷切片,通過key取值。 代碼示例: ~~~text package main import ( "fmt" "sort" ) func main() { map1 := make(map[int]string) map1[1] = "紅孩兒" map1[2] = "牛魔王" map1[3] = "白骨精" map1[4] = "小鉆風" map1[5] = "黃袍怪" map1[6] = "孔雀大明王" map1[7] = "白毛鼠" //獲取所有的key,取值后存儲到切片 keys := make([]int,0,len(map1)) for k,_ := range map1{ keys = append(keys,k) } fmt.Println(keys) //對key值進行排序 //內置函數sort包下的排序方法 sort.Ints(keys) fmt.Println(keys) for _,key := range keys{ fmt.Println(key,"-->",map1[key]) } //冒泡排序方法 for i := 1;i<len(keys);i++ { for j := 0;j<len(keys)-1;j++ { if keys[j] > keys[j+1] { keys[j],keys[j+1] = keys[j+1],keys[j] } } } for i := 1;i<=len(keys);i++ { fmt.Println(i,"-->",map1[i]) } } ~~~ ## 十一、你在項目里面會用到什么數據結構,例如map、slice 都會用到,包括基本數據類型:int、float、string、bool ,復合數據類型有:指針、數組、切片、字典(map)、通道、結構和接口 > 注:map和slice也會用到,當有明確的key值時,使用map,如果沒有明顯的key,就使用切片 ## 十二、如果用range修改切片元素的值,會發生什么? 我們經常會使用到range來幫助我們遍歷一些數據,通常情況下都是查看操作多一些,但是當我們需要對其原地址上的內容進行變更時,通常都是使用 for i:=0; i<len(); i++ 來修改值。在使用range的時候,通常會將該數據結構進行拷貝,來遍歷這一份拷貝后的副本,使用的是一個值傳遞,如果我們進行修改,修改的就只是副本,對原地址上的值不會產生任何影響。 ## 十三、了解空指針嗎? * 當一個指針被定義后沒有分配到任何變量時,它的值為 nil。 * nil 指針也稱為空指針。 * nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值。 ## 十四、一般怎么比較兩個結構體,怎么判斷他們是否相等? 一般沒有效率太高的方法: * if判斷比較:使用if一個個比較兩個結構體中元素的值:if(p1->age==p2->age),如果有一個元素不等,即是兩個實例不相等。 * 指針直接比較:如果保存的是同一個實例地址,則(p1==p2)為真。 ## 十五、make和new的區別是什么? * make 只用于 chan,map,slice 的初始化; * new 用于給類型分配內存空間,并且置零; * make 返回類型本身,new 返回指向類型的指針。 ## 十六、說一下你對并發編程的理解? * 所謂并發編程是指在一臺處理器上“同時”處理多個任務。 * 宏觀的并發是指在一段時間內,有多個程序在同時運行。 * 并發在微觀上,是指在同一時刻只能有一條指令執行,但多個程序指令被快速的輪換執行,使得在宏觀上具有多個進程同時執行的效果,但在微觀上并不是同時執行的,只是把時間分成若干段,使多個程序快速交替的執行。 ## 十七、碰到過分布式鎖的問題嗎?分布式鎖的原理你清楚嗎? golang中的分布式鎖可使用etcd進行實現,實現原理如下: * 在ectd系統里創建一個key * 如果創建失敗,key存在,則監聽該key的變化事件,直到該key被刪除,回到1 * 如果創建成功,則認為我獲得了鎖
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看