2013-01-19 6 views
5

Ich versuche, einen einfachen Taschenrechner in Go zu machen. Ich entwerfe es so, dass ich zuerst eine Befehlszeilenschnittstelle erstellen und in einer GUI-Schnittstelle austauschen kann. Der Projektstandort ist $GOPATH/src/gocalc (alle nachfolgenden Pfade beziehen sich auf den Projektstandort). Die Logik der Befehlszeilenschnittstelle wird in einer Datei gocalc.go gespeichert. Die Rechnerlogik ist in den Dateien calcfns/calcfns.go und operations/operations.go gespeichert. Alle Dateien haben Paketnamen identisch mit ihren Dateinamen (ohne Erweiterung), außer dem Hauptprogramm, gocalc.go, die in den package mainErstellen von Paketstruktur mit Kind-/Unterpaketen

calcfns.go Einfuhren operations.go über import "gocalc/operations" ist; gocalc.go Importe calcfns.go über import "gocalc/calcfns"

Fassen wir zusammen:

  • $GOPATH/src/gocalc/
    • gocalc.go
      • package main
      • import "gocalc/calcfns"
    • calcfns/
      • calcfns.go
        • package calcfns
        • import "gocalc/operations"
    • operations/
      • operations.go
        • package operations

Wenn ich versuche zu go build operations (aus dem Projekt dir), bekomme ich die Antwort: can't load package: package operations: import "operations": cannot find package Wenn ich go build gocalc/operations versuchen, erhalte ich can't load package: package gocalc/operations: import "gocalc/operations": cannot find package Wenn ich go build operations/operations.go versuchen es kompiliert fein

Wenn ich versuche, go build calcfns oder go build gocalc/calcfns, bekomme ich can't load package... Nachrichten, ähnlich denen in den Betrieben; aber wenn ich versuche, calcfns/calcfns.go es Drosseln auf der Import-Anweisung zu bauen: import "gocalc/operations": cannot find package

Schließlich, wenn ich go build . aus dem Projekt dir versuchen, es würgt ähnlich den vorherigen Absatz: import "gocalc/calcfns": cannot find package

Wie soll ich mein Kind strukturiere Pakete und/oder importieren Aussagen in einer Weise, dass go build wird nicht fehlschlagen?

Antwort

6

Dummerweise habe ich vergessen, meine GOPATH-Variable zu exportieren, so go env angezeigt "" für GOPATH. (Danke an jnml für den Vorschlag zu drucken go env; +1).

Danach (und Verschieben des Hauptprogramms in einen eigenen Ordner {project-dir}/gocalc/gocalc.go), konnte ich das Programm über go install gocalc/gocalc erstellen/installieren.

Moral der Geschichte, stellen Sie sicher, dass Sie geben export GOPATH=... statt GOPATH=... nur, wenn Ihr $ GOPATH Umgebungsvariable

1

Bitte versuchen Sie auch die Ausgabe von $ go env hinzuzufügen, um weitere Hinweise zu geben.Ansonsten sieht sowohl die Verzeichnisstruktur als auch die (gezeigt) Importanweisungen OK aus.

jedoch der Satz

Wenn ich versuche, Operationen zu gehen zu bauen (aus dem Projekt dir), bekomme ich die Antwort: nicht Paket laden kann: Paketoperationen: import „Operationen“:

nicht verpacken finden

klingt seltsam. Es scheint zu vermuten, Sie haben

package operations 

import "operations" 

in 'operations.go', was wäre der Schuldige dann ...?

+0

Nein, 'operations' nicht versuchte, sich selbst zu importieren. ;) Aber dein 'go env' hat mir gezeigt, dass ich' GOPATH = $ HOME/Projects/Go' anstelle von 'export GOPATH = $ HOME/Projects/Go' benutzt habe, was der eigentliche Schuldige war. Interessanterweise erzeugte "echo $ GOPATH" immer noch "' [abs path to ~]/Projects/Go' "; "go env" zeigte jedoch "GOPATH =" "oder ähnliches. Danke für den Vorschlag. +1 – weberc2

-1

Sehr einfache Einstellung:

Können sagen, ich habe ein Projekt/app namens: golang-playground

  1. Setzen Sie Ihre Root-Verzeichnis unter GOPATH/src/, in meinem Fall GOPATH=~/go/src (Befehl go env ausführen, um Ihre GOPATH zu erhalten). so vollständiger Pfad für meine app ist ~/go/src/golang-playground enter image description here

  2. Lassen Sie sagen Funktion Index() innerhalb der Datei verwendet werden sollen: router.go aus meiner main.go-Datei (die natürlich auf dem Wurzelverzeichnis ist). so in main.go:

    import (
        ... 
        "golang-playground/router" 
    ) 
    
    func main() { 
        foo.Bar("/", router.Index) // Notice caps means its public outside of file 
    }