我想知道findById
和findByValue
是否可以组合成一个函数?那是除了现有的params之外还传递结构中的字段吗?
import (
"fmt"
"errors"
)
type A struct {
id int
value int
}
func findById(as []A, i int) (*A, error) {
for _, a := range as {
if a.id == i {
return &account, nil
}
}
return nil, errors.New("no such item")
}
func findByValue(as []A, i int) (A, error) {
for _, a := range as {
if a.value == i {
return &account, nil
}
}
return nil, errors.New("no such item")
}
答案 0 :(得分:1)
如果您正在寻找func findByA(a []A, item A) (*A, error)
:
func findByA(a []A, item A) (*A, error) {
for i := 0; i < len(a); i++ {
if a[i].id == item.id && a[i].value == item.value {
return &a[i], nil
}
}
return nil, errors.New("no such item")
}
试试这个有效的示例代码:
package main
import "fmt"
import "errors"
type A struct {
id int
value int
}
func findById(a []A, id int) (*A, error) {
for i := 0; i < len(a); i++ {
if a[i].id == id {
return &a[i], nil
}
}
return nil, errors.New("no such item")
}
func findByValue(a []A, value int) (*A, error) {
for i := 0; i < len(a); i++ {
if a[i].value == value {
return &a[i], nil
}
}
return nil, errors.New("no such item")
}
func findByIdValue(a []A, id, value int) (*A, error) {
for i := 0; i < len(a); i++ {
if a[i].id == id && a[i].value == value {
return &a[i], nil
}
}
return nil, errors.New("no such item")
}
func findByA(a []A, item A) (*A, error) {
for i := 0; i < len(a); i++ {
if a[i].id == item.id && a[i].value == item.value {
return &a[i], nil
}
}
return nil, errors.New("no such item")
}
func main() {
t := []A{A{1, 2}, A{3, 4}, A{5, 6}}
a, err := findById(t, 3)
if err == nil {
fmt.Println(*a) // {3 4}
}
a, err = findByValue(t, 4)
if err == nil {
fmt.Println(*a) // {3 4}
}
a, err = findByIdValue(t, 3, 4)
if err == nil {
fmt.Println(*a) // {3 4}
}
a, err = findByA(t, A{3, 4})
if err == nil {
fmt.Println(*a) // {3 4}
}
}
如果你需要item的索引,你可以使用receiver方法,就像这个工作示例代码:
package main
import "fmt"
type A struct {
id int
value int
}
type SA []A
//it returns the index of the first instance of item in slice, or -1 if item is not present in slice.
func (t SA) find(a A) int {
for i := 0; i < len(t); i++ {
if t[i].id == a.id && t[i].value == a.value {
return i
}
}
return -1
}
func main() {
t := SA{A{1, 2}, A{3, 4}, A{5, 6}}
i := t.find(A{3, 4})
if i == -1 {
fmt.Println("no such item")
return
}
fmt.Println("t[", i, "] =", t[i]) // t[ 1 ] = {3 4}
}
输出:
t[ 1 ] = {3 4}
如果你需要item的索引,你可以使用函数,就像这个工作示例代码:
package main
import "fmt"
type A struct {
id int
value int
}
//it returns the index of the first instance of item in slice, or -1 if item is not present in slice.
func find(t []A, a A) int {
for i := 0; i < len(t); i++ {
if t[i].id == a.id && t[i].value == a.value {
return i
}
}
return -1
}
func main() {
t := []A{A{1, 2}, A{3, 4}, A{5, 6}}
i := find(t, A{3, 4})
if i == -1 {
fmt.Println("no such item")
return
}
fmt.Println("t[", i, "] =", t[i]) // t[ 1 ] = {3 4}
}
输出:
t[ 1 ] = {3 4}