2016-08-22 5 views
-1

Ich frage mich, ob findById und findByValue zu einer Funktion kombiniert werden können? Das heißt, das Feld in der Struktur zusätzlich zu den bestehenden Params zu übergeben?Wie übergibt man Felder einer Struktur an eine Funktion?

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

Warum übergibst du 'a.id' oder' a.value' nicht direkt an die struct? – tkausl

+0

lassen Sie mich das Problem überarbeiten. – ryan

+1

Ihr Beispiel weist mehrere Kompilierungsfehler auf, sodass es schwierig ist, genau zu wissen, was Sie zu tun versuchen. – JimB

Antwort

1

Wenn Sie suchen 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") 
} 

Versuchen Sie, diese Arbeitsbeispielcode:

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

Wenn Sie den Index der Artikel benötigen, können Sie Empfänger-Methode verwenden können , wie dieser funktionierende Beispielcode:

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

Ausgabe:

t[ 1 ] = {3 4} 

Wenn Sie den Index des Artikels benötigen, können Sie Funktion, wie dieser Arbeitsbeispielcode verwenden:

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

Ausgang:

t[ 1 ] = {3 4} 
+0

Idiomatic Go empfiehlt die Verwendung eines Fehlerrückgabewerts anstelle von magischen Zahlen, um anzuzeigen, dass ein Fehler nicht gefunden wurde. – Kaedys

+1

@kaedys nein, es ist nicht magisch: wie Standard-Bibliothek: 'strings.Index()' gibt es den Index der ersten Instanz des Elements in Scheibe, oder -1 wenn Element nicht in Scheibe vorhanden ist. siehe: 'func Index (s, sep string) int' –

Verwandte Themen