3 回答

TA貢獻1777條經驗 獲得超3個贊
集合通常作為沒有值的映射來實現。Astruct{}
在 Go 中實際上是空的。
type Empty struct {}
type TestSet struct {
? ?set map[Test]Empty
}
為了使其起作用,Test
必須具有可比性。
如果結構值的所有字段都具有可比性,則結構值是可比的。如果兩個結構值對應的非空白字段相等,則它們相等。
所以Test具有可比性。
package main;
import (
? ? "fmt"
)
type Empty struct {}
type TestSet struct {
? ? set map[Test]Empty
}
func (ts *TestSet) Add(t Test) bool {
? ? if _, present := ts.set[t]; present {
? ? ? ? return false
? ? } else {
? ? ? ? ts.set[t] = Empty{}
? ? ? ? return true
? ? }
}
type Test struct {
? ? phoneNumber string
? ? name? ? ? ? string
}
func main() {
? ? set := TestSet{ set: make(map[Test]Empty) }
? ? test1 := Test{ phoneNumber: "555-555-5555", name: "Yarrow Hock" }
? ? test2 := Test{ phoneNumber: "555-555-5555", name: "Yarrow Hock" }
? ? test3 := Test{ phoneNumber: "123-555-5555", name: "Yarrow Hock" }
? ? if set.Add( test1 ) {
? ? ? ? fmt.Println("Added 1")
? ? }
? ? if set.Add( test2 ) {
? ? ? ? fmt.Println("Added 2")
? ? }
? ? if set.Add( test3 ) {
? ? ? ? fmt.Println("Added 3")
? ? }
? ? for test := range set.set {
? ? ? ? fmt.Println(test.phoneNumber)
? ? }
}
您還可以使用golang-set 庫。

TA貢獻1893條經驗 獲得超10個贊
也許,像這樣:
package main
type Test struct {
phoneNumber string
name string
}
type TestSet struct {
Items map[string]bool
}
func (ts *TestSet) Add(t *Test) {
ts.Items[t.phoneNumber+"\x80"+t.name] = true
}
func main() {}
游樂場:https://play.golang.org/p/48fVQcvp3sW

TA貢獻1799條經驗 獲得超9個贊
您可以通過將值類型設為 map 來模擬 golang 中的集合struct{}。您的結構的一些示例代碼Test:
package main
import "fmt"
type TestSet map[Test]struct{}
func (ts TestSet) Add(t Test) {
? ? ts[t] = struct{}{}
}
type Test struct {
? ? phoneNumber string
? ? name string
}
func main() {
? ? ts := TestSet{}
? ? t1 := Test{"a", "b"}
? ? t2 := Test{"a", "b"}
? ? ts.Add(t1)
? ? ts.Add(t2)
? ? fmt.Println(ts) // Output: map[{a b}:{}]
}
這與您的函數簽名不完全匹配,因為我使用值而不是引用。這意味著我不必Equals像您那樣定義自定義函數。此外,通過將參數作為值傳遞,映射檢查結構本身的相等性而不是引用。
需要注意的是,此方法僅在結構具有可比性時才有效。
- 3 回答
- 0 關注
- 140 瀏覽
添加回答
舉報