golang slice的判空 和 併發安全

2021-10-20 12:03:52 字數 1451 閱讀 4712

判斷slice是否為空,不能與nil進行比較做判斷,因為slice有可能已初始化。而是應該使用len計算長度。

例如

package main

import (

"fmt"

)func main()

fmt.println("slice1 == nil:", slice1 == nil)

fmt.println("slice1 len:", len(slice1))

fmt.println("slice2 == nil:", slice2 == nil)

fmt.println("slice2 len:", len(slice2))

}

output:

slice1 == nil: true

slice1 len: 0

slice2 == nil: false

slice2 len: 0

slice不是併發安全的。

package main

import (

"fmt"

"time"

)var slice1 int

}func main()

time.sleep(time.second)

for i, v := range slice1

}

output:

7516 9996

7517 9995

7518 9997

7519 9998

7520 9999

從輸出可以看到,slice不是併發安全的,資料有丟失。

如何達到併發安全?

加鎖是一種方式。

看下面的例子,通過加鎖,達到互斥效果,實現併發安全。

package main

import (

"fmt"

"sync"

"time"

)var slice1 int

var lock sync.mutex

lock.lock()

defer lock.unlock()

}func main()

time.sleep(time.second)

for i, v := range slice1

}

output:

9991 9627

9992 9991

9993 9995

9994 9993

9995 9992

9996 9998

9997 9278

9998 9948

9999 9999

從輸出可以看到,資料沒有丟失,可以正常列印。

環形佇列如何判空和判滿

環形佇列的判空和判滿是乙個比較基礎的問題,可以通過以下兩種方法來實現,定義環形佇列抽象類 define max size 1024 class circularqueue circularqueue circularqueue int size this data new int size this...

Velocity判空的方法

前端使用velocity,經常會遇到判斷是否為null的情景,通常判斷是否為null有下面幾種方法 1.if foo 判斷 foo為空,判斷非空為 if foo 2.使用 ifnull 或 ifnotnull ifnull foo 要使用這個特性必須在velocity.properties檔案中加入...

SQL的字段判空

請看下面的 products 表 p id productname unitprice unitsinstock unitsonorder 1computer 69925152 printer 36536 3telephone 28015957 假如 unitsonorder 是可選的,而且可以包含...