国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

go 語言常見問題(2)

這篇具有很好參考價值的文章主要介紹了go 語言常見問題(2)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

11. recover的執(zhí)行時機(jī)

無,recover 必須在 defer 函數(shù)中運(yùn)行。recover 捕獲的是祖父級調(diào)用時的異常,直接調(diào)用時無效。

func main() {
    recover()
    panic(1)
}

直接 defer 調(diào)用也是無效。

func main() {
    defer recover()
    panic(1)
}

defer 調(diào)用時多層嵌套依然無效。

func main() {
    defer func() {
        func() { recover() }()
    }()
    panic(1)
}

必須在 defer 函數(shù)中直接調(diào)用才有效。

func main() {
    defer func() {
        recover()
    }()
    panic(1)
}

12. 閉包錯誤引用同一個變量問題怎么處理

在每輪迭代中生成一個局部變量 i 。如果沒有 i := i 這行,將會打印同一個變量。

func main() {
    for i := 0; i < 5; i++ {
        i := i
        defer func() {
            println(i)
        }()
    }
}

或者是通過函數(shù)參數(shù)傳入 i 。

func main() {
    for i := 0; i < 5; i++ {
        defer func(i int) {
            println(i)
        }(i)
    }
}

13. 在循環(huán)內(nèi)部執(zhí)行defer語句會發(fā)生啥

defer 在函數(shù)退出時才能執(zhí)行,在 for 執(zhí)行 defer 會導(dǎo)致資源延遲釋放。

并且會使調(diào)用棧劇增(如果循環(huán)次數(shù)多的話),比較好的方式是使用局部函數(shù)處理。

func main() {
    for i := 0; i < 5; i++ {
        func() {
            f, err := os.Open("/path/to/file")
            if err != nil {
                log.Fatal(err)
            }
            defer f.Close()
        }()
    }
}

func 是一個局部函數(shù),在局部函數(shù)里面執(zhí)行 defer 將不會有問題。

14. 說出一個避免Goroutine泄露的措施

可以通過 context 包來避免內(nèi)存泄漏。

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    ch := func(ctx context.Context) <-chan int {
        ch := make(chan int)
        go func() {
            for i := 0; ; i++ {
                select {
                case <- ctx.Done():
                    return
                case ch <- i:
                }
            }
        } ()
        return ch
    }(ctx)

    for v := range ch {
        fmt.Println(v)
        if v == 5 {
            cancel()
            break
        }
    }
}

下面的 for 循環(huán)停止取數(shù)據(jù)時,就用 cancel 函數(shù),讓另一個協(xié)程停止寫數(shù)據(jù)。如果下面 for 已停止讀取數(shù)據(jù),上面 for 循環(huán)還在寫入,就會造成內(nèi)存泄漏。

15. 如何跳出for select 循環(huán)

通常在for循環(huán)中,使用break可以跳出循環(huán),但是注意在go語言中,for select配合時,break 并不能跳出循環(huán)。

func testSelectFor2(chExit chan bool){
 EXIT:
    for  {
        select {
        case v, ok := <-chExit:
            if !ok {
                fmt.Println("close channel 2", v)
                break EXIT//goto EXIT2
            }

            fmt.Println("ch2 val =", v)
        }
    }

//EXIT2:
    fmt.Println("exit testSelectFor2")
}

16. 如何在切片中查找

go中使用 sort.searchXXX 方法,在排序好的切片中查找指定的方法,但是其返回是對應(yīng)的查找元素不存在時,待插入的位置下標(biāo)(元素插入在返回下標(biāo)前)??梢酝ㄟ^封裝如下函數(shù),達(dá)到目的。

func IsExist(s []string, t string) (int, bool) {
    iIndex := sort.SearchStrings(s, t)
    bExist := iIndex!=len(s) && s[iIndex]==t

    return iIndex, bExist
}

17. 如何初始化帶嵌套結(jié)構(gòu)的結(jié)構(gòu)體

go 的哲學(xué)是組合優(yōu)于繼承,使用 struct 嵌套即可完成組合,內(nèi)嵌的結(jié)構(gòu)體屬性就像外層結(jié)構(gòu)的屬性即可,可以直接調(diào)用。注意初始化外層結(jié)構(gòu)體時,必須指定內(nèi)嵌結(jié)構(gòu)體名稱的結(jié)構(gòu)體初始化,如下看到 s1方式報(bào)錯,s2 方式正確。

type stPeople struct {
    Gender bool
    Name string
}

type stStudent struct {
    stPeople
    Class int
}

//嘗試4 嵌套結(jié)構(gòu)的初始化表達(dá)式
//var s1 = stStudent{false, "JimWen", 3}
var s2 = stStudent{stPeople{false, "JimWen"}, 3}
fmt.Println(s2.Gender, s2.Name, s2.Class)

18. 切片和數(shù)組的區(qū)別

數(shù)組是具有固定長度,且擁有零個或者多個,相同數(shù)據(jù)類型元素的序列。數(shù)組的長度是數(shù)組類型的一部分,所以[3]int 和 [4]int 是兩種不同的數(shù)組類型。
數(shù)組需要指定大小,不指定也會根據(jù)初始化的自動推算出大小,不可改變;數(shù)組是值傳遞。
數(shù)組是內(nèi)置類型,是一組同類型數(shù)據(jù)的集合,它是值類型,通過從0開始的下標(biāo)索引訪問元素值。在初始化后長度是固定的,無法修改其長度。當(dāng)作為方法的參數(shù)傳入時將復(fù)制一份數(shù)組而不是引用同一指針。數(shù)組的長度也是其類型的一部分,通過內(nèi)置函數(shù)len(array)獲取其長度。
數(shù)組定義:

var array [10]int
var array =[5]int{1,2,3,4,5}

切片表示一個擁有相同類型元素的可變長度的序列。切片是一種輕量級的數(shù)據(jù)結(jié)構(gòu),它有三個屬性:指針、長度和容量。
切片不需要指定大小;切片是地址傳遞;切片可以通過數(shù)組來初始化,也可以通過內(nèi)置函數(shù)make()初始化 。初始化時len=cap,在追加元素時如果容量cap不足時將按len的2倍擴(kuò)容。
切片定義:

var slice []type = make([]type, len)

19. new和make的區(qū)別

new 的作用是初始化一個指向類型的指針 (*T) 。
new 函數(shù)是內(nèi)建函數(shù),函數(shù)定義:func new(Type) Type。
使用 new 函數(shù)來分配空間。傳遞給 new 函數(shù)的是一個類型,不是一個值。返回值是指向這個新分配的零值的指針。
make 的作用是為 slice,map 或 chan 初始化并返回引用 (T)。
make 函數(shù)是內(nèi)建函數(shù),函數(shù)定義:func make(Type, size IntegerType) Type;第一個參數(shù)是一個類型,第二個參數(shù)是長度;返回值是一個類型。
make(T, args) 函數(shù)的目的與 new(T) 不同。它僅僅用于創(chuàng)建 Slice, Map 和 Channel,并且返回類型是 T(不是T
)的一個初始化的(不是零值)的實(shí)例。

20. Printf()、Sprintf()、Fprintf()函數(shù)的區(qū)別用法是什么

都是把格式好的字符串輸出,只是輸出的目標(biāo)不一樣。文章來源地址http://www.zghlxwxcb.cn/news/detail-821890.html

  • Printf(),是把格式字符串輸出到標(biāo)準(zhǔn)輸出(一般是屏幕,可以重定向)。Printf() 是和標(biāo)準(zhǔn)輸出文件 (stdout) 關(guān)聯(lián)的,F(xiàn)printf 則沒有這個限制。
  • Sprintf(),是把格式字符串輸出到指定字符串中,所以參數(shù)比printf多一個char*。那就是目標(biāo)字符串地址。
  • Fprintf(),是把格式字符串輸出到指定文件設(shè)備中,所以參數(shù)比 printf 多一個文件指針 FILE*。主要用于文件操作。Fprintf() 是格式化輸出到一個stream,通常是到文件。

到了這里,關(guān)于go 語言常見問題(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Go常見問題(一)Visual Studio Code 無法識別 go 指令

    PS D:… go env go : 無法將“go”項(xiàng)識別為 cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確,然后再試一次。 所在位置 行:1 字符: 1 go env ~~ CategoryInfo : ObjectNotFound: (go:String) [], CommandNotFoundException FullyQualifiedErrorId : CommandNotFoundExcep

    2024年02月12日
    瀏覽(25)
  • vue + Element Ui 中生成動態(tài)合并表格及后端數(shù)據(jù)說明及常見問題

    vue + Element Ui 中生成動態(tài)合并表格及后端數(shù)據(jù)說明及常見問題

    在利用vue的一些框架開發(fā)中(比如ruoyi),有時會遇見這樣需要一對多對多顯示的表格(如下圖),按照相同項(xiàng)合并多余的行??吹竭@如果和你遇見的問題相似那就步入正題 講解中不以具體某些數(shù)據(jù)舉例,統(tǒng)一用tableDatap[]數(shù)據(jù)對象數(shù)組表示需要遍歷的數(shù)據(jù) 到這里前端的開發(fā)就

    2024年02月12日
    瀏覽(26)
  • char常見問題之一【C語言】

    char常見問題之一【C語言】

    在所寫的代碼中: char?ch0?=?\\\"asd\\\"; 報(bào)錯:因?yàn)閏har類型的變量只能存儲一個字符,不能存儲字符串 char?ch1=\\\'a\\\'; 正確 char?ch2=\\\"a\\\"; 報(bào)錯:因?yàn)椋m然a是一個字符,但是用了雙引號,不管是幾個字符,都會在末尾加上‘\\0’,所以最后是‘a(chǎn)’和‘\\0’一共兩個字符,不是一個字符,

    2024年01月23日
    瀏覽(21)
  • C語言學(xué)習(xí)筆記——常見問題

    VS執(zhí)行結(jié)果一閃而過 生成的 *.exe 文件打開時會一閃而過,從而觀察不到其運(yùn)行的結(jié)果————這是因?yàn)?main() 函數(shù)結(jié)束時,DOS 窗口會自動關(guān)閉 1、通過改變設(shè)置來解決 按以下順序打開配通過改變設(shè)置來置窗口:項(xiàng)目-屬性-配置屬性-鏈接器-系統(tǒng)-子系統(tǒng)——在子系統(tǒng)右側(cè)點(diǎn)擊下

    2024年02月09日
    瀏覽(24)
  • Android開發(fā)常見問題

    Android開發(fā)常見問題

    看下當(dāng)前工程目錄中是否存在gradle目錄,如果不存在,創(chuàng)建一個新的工程,拷貝新工程的gradle文件夾到當(dāng)前工程。gradle中有兩個文件。 解決方法: 1.找到c盤下的gradle.properties文件 2.將代理注釋 3.在gradle中設(shè)置不使用代理,重新加載,問題解決 gradle的版本太老了。將gradle升級

    2024年02月13日
    瀏覽(25)
  • JAVA開發(fā)中常見問題

    JAVA開發(fā)中常見問題

    目錄 1.深淺克隆問題 2.Mysql中可以代替左模糊或全查詢的函數(shù)方法 3.開發(fā)時需注意,使用String類的equals()方法時,原則上需要左邊的變量不能為null值,避免程序執(zhí)行時出現(xiàn)空指針報(bào)錯 4.Mysql Update的高效應(yīng)用 5.Mysql Insert 的高效應(yīng)用 6.在try-catch-finally代碼塊中return或者throw Exception時需

    2024年02月05日
    瀏覽(29)
  • Java開發(fā)中的常見問題和解決方法:如何解決常見的性能和bug問題

    Java開發(fā)中的常見問題和解決方法:如何解決常見的性能和bug問題

    ? 在Java開發(fā)中,我們經(jīng)常會面臨各種各樣的問題,包括性能問題和Bug。這些問題可能會導(dǎo)致應(yīng)用程序的運(yùn)行變慢、不穩(wěn)定甚至崩潰。本文將介紹一些常見的Java開發(fā)問題,并提供解決這些問題的方法和技巧,幫助開發(fā)人員更好地處理性能和Bug問題。 性能問題是Java開發(fā)中最常見

    2024年02月09日
    瀏覽(36)
  • 音視頻開發(fā)常見問題(五):視頻黑屏

    本文介紹了視頻黑屏的可能原因和解決方案。主要原因包括用戶主動關(guān)閉視頻、網(wǎng)絡(luò)問題和渲染問題。解決方案包括優(yōu)化網(wǎng)絡(luò)穩(wěn)定性、確保視頻渲染視圖設(shè)置正確、提供清晰的提示、實(shí)時監(jiān)測網(wǎng)絡(luò)質(zhì)量、使用詳細(xì)的日志系統(tǒng)、開啟視頻預(yù)覽功能、使用視頻流回調(diào)、處理編解碼

    2024年02月08日
    瀏覽(18)
  • .NET 高級開發(fā)人員面試常見問題及解答

    當(dāng)面試.NET高級開發(fā)人員時,面試官通常會圍繞技術(shù)深度、問題解決能力、項(xiàng)目經(jīng)驗(yàn)以及編程理念等方面提出問題。以下是20個常見的面試問題及其詳細(xì)解答: 問題:請簡述ASP.NET MVC的工作原理? 解答:ASP.NET MVC是一個基于MVC(模型-視圖-控制器)設(shè)計(jì)模式的Web應(yīng)用程序框架。

    2024年04月26日
    瀏覽(21)
  • flink開發(fā)常見問題 —— flink-kafka 依賴版本沖突問題

    flink開發(fā)常見問題 —— flink-kafka 依賴版本沖突問題

    由于 flink / kafka 的版本不斷更新,創(chuàng)建項(xiàng)目的時候就應(yīng)當(dāng)考慮清楚這幾個依賴庫的版本問題,盡可能地與實(shí)際場景保持一致,比如服務(wù)器上部署的 kafka 是哪個版本,flink 是哪個版本,從而確定我們需要開發(fā)的是哪個版本,并且在真正的開發(fā)工作開始之前,應(yīng)當(dāng)先測試一下保證

    2024年02月07日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包