2017-12-14 3 views
-3

Ich erstelle eine Web-API.So importieren Sie ein lokales Paket in GO

Ich baute meinen Server und Controller in der gleichen Datei main.go.

Ich habe einen anderen Dateinamen model.go erstellt, wo ich eine Person struct.

Ich kann mein Modell nicht in main.go exportieren.

Jedes Mal, wenn ich laufe oder bauen erhalte ich diese Fehlermeldung:

can't load package: package .: found packages main 

Gibt es eine Möglichkeit Func/konst zu exportieren und sie in der Datei mit gutem Pfad zu importieren? (So ​​wie JavaScript funktioniert).

Das ist mein Baum:

myapp/ 
    --main.go/ 
    --model.go/ 

Das ist mein Import: main.go

package main 

import (
    "encoding/json" 
    "log" 
    "net/http" 

    "./person" 
    "github.com/gorilla/mux" 
) 

model.go

package person 

type Person struct { 
    ID  string `json:"id,omitempty"` 
    Firstname string `json:"firstname,omitempty"` 
    Lastname string `json:"lastname,omitempty"` 
    Address *Address `json:"address,omitempty"` 
} 

var people []Person 
+2

Dies ist _nicht_ wie Pakete funktionieren. Lesen Sie How to Write Go-Code und _stick_ _to_ _it_ (keine Diskussion). Sie importieren Pakete (die im Grunde ganze Dateisystemordner sind) und _not_ Dateien. Auch Duplizieren, dann Zehntel. – Volker

Antwort

1

Innerhalb desselben Ordners müssen Sie den gleichen Paketnamen haben.

Wenn Golang Prozesse importiert, lädt es alle Dateien im selben Verzeichnis als Ganzes.

Angesichts der Code, den Sie vorgestellt haben, muss model.go Paketname Haupt sein.

Sie müssen einfach nicht model.go von main.go importieren.

Jetzt gibt es eine kleine Sache zu wissen. Wenn Sie run build/run/install ausführen, wird die Liste der Dateien übernommen, die als Parameter übergeben werden, um den Build-Prozess zu initialisieren.

In Ihrer aktuellen Konfiguration bedeutet dies, dass Sie alle Dateien, die das Hauptpaket enthalten, an die Befehlszeile übergeben müssen. Andernfalls werden sie ignoriert. In Ihrem Fall bedeutet das einen Buildfehler.

Im Klartext, werden Sie go build *.go statt go build main.go

in Zukunft tun, wenn Sie mehrere Quelldateien zu bauen vermeiden möchten, sollten Sie eine einzigartige main.go haben, mit dem minimalen Code darin zu initialisieren das Programm, das du schreibst. Als Konsequenz existiert der Inhalt von model.go in einem anderen Paket (Verzeichnis) und wird über eine import xyz-Anweisung in main importiert.

Schließlich muss Importpfad der import Direktiven nicht relativ zum aktuellen Arbeitsverzeichnis sein. Sie sind alle GOPATH/src basiert.

+0

Beachten Sie, dass Importpfade _kann_ relativ sein können, aber relative Importpfade, obwohl möglich, sollten niemals "EVER_" verwendet werden. _EVER! _ – Kaedys

+0

~~ im Hauptpaket, könnte in Ordnung sein, obwohl schlechte Praxis. Außerdem wird beim Testen ein anderer Paketname im selben Ordner verwendet. –

+1

Tests _können_ einen anderen Paketnamen im selben Ordner verwenden, aber nur mit einem sehr spezifischen Muster ('Paketname_test'), und nur dann, wenn Blackbox-Tests nützlicher sind als Whitebox-Tests (was in den meisten Fällen funktionierende Unit-Tests verhindert). – Kaedys

Verwandte Themen