2016-03-31 12 views
1

Ich bin auf der Suche nach Best Practices beim Schreiben von Go-Code. Ich habe zwei Methoden, die in der Logik sehr eng sind. Ich möchte es nur besser kodieren, und gibt es eine Möglichkeit, AddAuthor- und AddTitle-Methoden mit Go zu kombinieren.Schönere Methoden in Go Lang

Ich denke etwas wie func (t * Test) SetProperty ("name", "alfa") .. eine Art Ansatz, aber nicht wissen, wie man diesen Code besser machen. Kommentare sind willkommen. Auch wenn Sie mir einen Link mit gut geschriebenen Go-Code in Bezug auf Stil und Praxis geben, würde ich mich freuen.

Danke,

type Test struct {                             
    Title   string              
    Author   string              
}                    

func (t *Test) AddAuthor(name string) (*Test, error) {       
    if err := validateStringLength(name); err != nil {       
     return nil, err               
    }                   
    t.Author = name                
    return t, nil                
}                    

func (t *Test) AddTitle(title string) (*Test, error) {       
    if err := validateStringLength(title); err != nil {       
     return nil, err               
    }                   
    t.Title = title                
    return t, nil                
}                    

func validateStringLength(field string) error {         
    if len(field) > 255 {              
     return fmt.Errorf("field %v is too long.", field)      
    }                   
    return nil                 
} 
+0

Warum kehren Sie 't'? Du mutierst 't', du musst es nicht zurückgeben, es sei denn, du änderst etwas grundlegendes daran (wie' append') –

+1

ahh du hast Recht, ich habe zu viel Zeit in Ruby-Zone verbracht vergaß alle Zeiger :(Vielen Dank – manorie

+0

Ich musste die volle Zeit zu Python nach einem Monat tauschen, nachdem ich anfing zu lernen, ein Projekt unter sehr engen Terminen zu beenden. kam Verbot nach Go Land nach drei Wochen erinnern fast NICHTS. Ich fühle deine Schmerzen! –

Antwort

4

Hier ist eine Möglichkeit, es zu tun:

func (t *Test) AddAuthor(author string) (*Test, error) { 
    return t.setString(&t.Author, author) 
} 

func (t *Test) AddTitle(title string) (*Test, error) { 
    return t.setString(&t.Title, title) 
} 

func (t *Test) setString(p *string, v string) (*Test, error) { 
    if len(v) > 255 { 
    return nil, fmt.Errorf("field %v is too long.", v) 
    } 
    *p = v 
    return t, nil 
} 
+0

Vielen Dank, einfach und gut aussehend – manorie

+0

@manie sicher sein, "es als Antwort zu markieren", um Kredit zu geben, wo Kredit fällig ist. :) – eduncan911