emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go の slices.Contains はカスタム struct の slice も比較できる

ということを知りませんでした。

// You can edit this code!
// Click here and start typing.
package main

import (
    "fmt"
    "slices"
)

type X struct {
    ID   int
    Name string
}

type xarr []X

func main() {
    x := X{
        ID:   1,
        Name: "taro",
    }

    xx := X{
        ID:   2,
        Name: "jiro",
    }

    xarr1 := []X{x}

    fmt.Println(slices.Contains(xarr1, x))

    xarr2 := []X{xx}

    fmt.Println(slices.Contains(xarr2, x))
}

https://go.dev/play/p/usPRZnNm8rK

また、ある特定のフィールドを持つ struct があるかどうかは slices.ContainsFunc が使えました。

// You can edit this code!
// Click here and start typing.
package main

import (
    "fmt"
    "slices"
)

type X struct {
    ID   int
    Name string
}

type xarr []X

func main() {
    x := X{
        ID:   1,
        Name: "taro",
    }

    xarr := []X{x}

    fmt.Println(slices.ContainsFunc(xarr, func(e X) bool {
        return e.Name == "taro"
    }))
}

https://go.dev/play/p/RgBNAISaNDB

slices package での比較処理は線形探索になるので、あまりに大きな slice だとパフォーマンスに影響が出そうですが、結構柔軟に使うことができて便利です。