如何将结构的字段传递给函数?

时间:2016-08-22 17:24:32

标签: go

我想知道findByIdfindByValue是否可以组合成一个函数?那是除了现有的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")
}

1 个答案:

答案 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}