2017-03-20 2 views
0

Ich bin neu in Golang und ich versuche, ein Home-Automation-Framework in Golang zu schreiben, mit dem Micro-Framework und Protobuf-Framework.Golang Parsing von ProtoBuf

Ich habe derzeit eine harte Zeit zu versuchen, eine einfache Registrierung Typ Service zu implementieren.

Ein Beispiel für das Problem, das ich habe ist, dass ich die folgende haben, ich möchte eine Liste der Geräte erhalten zu können, sofern ein Kunde hat eine GET-Anforderung an http://localhost:8080/view/devices

habe ich folgendes protobuf Definition :

syntax = "proto3"; 

service DRegistry { 
    rpc View(ViewRequest) returns (DeviceRegistry) {} 
} 

message DeviceRegistry { 
    repeated Device devices = 1; 
} 

message ViewRequest { 
    string Alias = 1; 
} 

message Device { 
    string Alias = 1; 
    string HWAddress = 2; 
    string WakeUpMethod = 3; 
    repeated string BoundServices = 4; 
} 

Dann in meinem Dienst defination habe ich folgendes:

package main 

import (
    "log" 

    micro "github.com/micro/go-micro" 
    proto "github.com/srizzling/gotham/proto/device" 

    "golang.org/x/net/context" 
) 

// DRegistry stands for Device Registry and is how devices register to Gotham. 
type DRegistry struct{} 

var devices map[string]proto.Device 

func (g *DRegistry) View(ctx context.Context, req *proto.ViewRequest, rsp *proto.DeviceRegistry) error { 
    filter := req.Alias 
devices, err := filterDevices(filter) 
rsp.Devices = devices 
} 

func filterDevices(filter string) (*[]proto.Device, error) { 
    // Currently only supports listing a single service for now 
    // TODO: expand filter to be more consise 
    filteredDevices := make([]proto.Device, 0, len(devices)) 
    for _, e := range devices { 
     for _, f := range e.BoundServices { 
      if f == filter { 
       filteredDevices = append(filteredDevices, e) 
      } 
     } 
    } 
    return &filteredDevices, nil 
} 

func main() { 
    service := micro.NewService(
     micro.Name("DRegistry"), 
    ) 
    proto.RegisterDRegistryHandler(service.Server(), new(DRegistry)) 

    if err := service.Run(); err != nil { 
     log.Fatal(err) 
    } 
} 

das Problem, das ich habe, ist, dass meine IDE (Visual Stud io Code) ist, dass I cannot use devices (type *[]device.Device) as type []*device.Device in assignment die verwirrend ist.

TLDR: Wie ordne ich der proto.DeviceRegistry eine Sammlung von proto.Devices zu?

+0

Hallo Rückkehr! Auf welcher Zeile erhalten Sie die Fehlermeldung? '* [] device.Device' - Zeiger auf eine Scheibe von' device.Device'. '[] * device.Device' - Scheibe von Zeigern zu einem 'device.Device'. Diese lesen könnte nützlich für Sie sein: https://divan.github.io/posts/avoid_gotchas/ –

+0

Das war eine gute Dokumentation, danke! –

Antwort

2
func filterDevices(filter string) ([]*proto.Device, error) { 
    // Currently only supports listing a single service for now 
    // TODO: expand filter to be more consise 
    filteredDevices := make([]*proto.Device, 0, len(devices)) 
    for _, e := range devices { 
     for _, f := range e.BoundServices { 
      if f == filter { 
       filteredDevices = append(filteredDevices, &e) 
      } 
     } 
    } 
    return filteredDevices, nil 
} 

Es ist eine Differenz zwischen einer Scheibe von Zeigern ([] *) und ein Zeiger auf eine Scheibe (* []). Sie geben einen Zeiger auf die Scheibe zurück, während Sie eine Scheibe von Zeigern wünschen. Wir können dies lösen, indem sie:

  • aktualisiert filterDevices Signatur eine Scheibe Zeiger eine Scheibe Zeiger
  • aktualisiert make Gespräch zurückzukehren
  • Unter der Adresse e in Ihrem Anruf zu tätigen anhängen (wir eine Scheibe von Zeigern auf Geräte darauf zugreifen können)
  • Nicht die Adresse der Scheibe
+0

Danke! Das hat es geklärt! –