英文:
Go: Check if every item in a slice meets a condition
问题
在Go语言中,可以使用循环来检查切片中的每个元素是否满足条件。对于你的特定情况,你可以使用以下代码来检查一个字节切片中的所有字节是否都为0:
package main
import "fmt"
func main() {
byteArray := [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0} // 可以看作是一个字节切片
isEmpty := true
for _, b := range byteArray {
if b != 0 {
isEmpty = false
break
}
}
fmt.Println(isEmpty) // false
}
这段代码使用了一个for
循环来遍历字节切片中的每个元素。如果发现任何一个元素不等于0,则将isEmpty
设置为false
并跳出循环。如果所有元素都为0,则isEmpty
保持为true
。最后,打印isEmpty
的值。
这是一种简洁而直接的方法来检查切片中的每个元素是否满足条件。
英文:
What would be the most elegant way to check if every item in a slice meets some condition? In my specific scenario, I have a slice of bytes: [16]byte. I need to check if all bytes are 0.
In JS, for example, I would do something like that:
const uint8Array = new Uint8Array([0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0])//Can be thought of as an array of "bytes"
const isEmpty = uint8Array.every(byte=>byte === 0)//Check that every "byte" is zero
console.log(isEmpty)//false
What's the cleanest and most straightforward way to do this in Go?
答案1
得分: 2
为了提高可读性和灵活性(例如,如果您需要操作除了byte
之外的其他类型),您可以编写一个小的All
通用函数,它具有以下特点:
- 接受一个切片和一个对该切片的元素类型的谓词,
- 当且仅当谓词对切片的所有元素都满足时返回
true
。
然后,您可以自由地将该通用函数与不同的切片和谓词一起使用。
package main
import "fmt"
func main() {
bs := []byte{15: 1} // 16个字节的切片,除了最后一个字节外,其他都是零
isZero := func(b byte) bool { return b == 0 }
fmt.Println(All(bs, isZero)) // false
}
func All[T any](ts []T, pred func(T) bool) bool {
for _, t := range ts {
if !pred(t) {
return false
}
}
return true
}
不需要为All
函数创建一个库,一点复制比一点依赖更好。
英文:
For readability and flexibility (e.g. if you need to operate on types other than byte
), you may benefit from writing a small All
generic function that
- accepts a slice and a predicate on the element type of that slice, and
- returns
true
if and only if the predicate is satisfied for all elements of the slice.
You'll then be free to put that generic function to use with different slices and predicates.
package main
import "fmt"
func main() {
bs := []byte{15: 1} // slice of 16 bytes, all but the last one of which are zero
isZero := func(b byte) bool { return b == 0 }
fmt.Println(All(bs, isZero)) // false
}
func All[T any](ts []T, pred func(T) bool) bool {
for _, t := range ts {
if !pred(t) {
return false
}
}
return true
}
No need to create a library for that All
function, though; a little copying is better than a little dependency.
答案2
得分: 2
使用bytes包会很容易,这里有一个示例:
func main() {
n := []byte{0,0,0,0,0,0,0}
b := bytes.ContainsRune(n, 1)
fmt.Println(b)
}
在bytes包中,有多个方法可以用来检查结果,比如检查字符、多个包含等等。
英文:
It would be easy if you use the bytes package, here is an example :
func main() {
n := []byte{0,0,0,0,0,0,0}
b := bytes.ContainsRune(n, 1)
fmt.Println(b)
}
In bytes package there are multiple methods you can call for your result, like checking char, or multiple contains etc.
答案3
得分: 1
最直接的方法是使用基于范围的for循环,因为据我所知,Go语言没有类似于.ForEach
的内置函数。
如果你不需要索引,可以在循环中省略它,你将得到类似的结果:
isEmpty := true
for _, val := range uint8Array {
if val != 0 {
isEmpty=false
break
}
}
fmt.Println(isEmpty)
如果你需要多次使用该函数,你也可以将其定义为一个独立的函数:
func IsEmpty(arr *[]any) bool {
for _, val := range *arr {
if val != 0 {
return false
}
}
return true
}
尽管最后一个方法可能会对某些数据类型造成问题。
英文:
The most straightforward way is to use a range-based for loop, since as far as I'm aware, Go doesn't have built-in function similar to .ForEach
.
If you don't need an index, you can omit it from the loop and you will have something similar:
isEmpty := true
for _, val := range uint8Array {
if val != 0 {
isEmpty=false
break
}
}
fmt.Println(isEmpty)
If you use the function repeatedly, you can define it as your own separate function as well.
func IsEmpty(arr *[]any) bool {
for _, val := range *arr {
if val != 0 {
return false
}
}
return true
}
Although the last one might cause issues for some data types.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论