Cara menggunakan paket khusus

178

Saya mencoba membuat dan menggunakan paket khusus di Go. Mungkin sesuatu yang sangat jelas tetapi saya tidak dapat menemukan banyak informasi tentang ini. Pada dasarnya, saya memiliki dua file ini di folder yang sama:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Ketika saya mencoba go run main.go, saya mendapatkan kesalahan ini:

main.go:4:2: import "mylib": cannot find package

Saya sudah mencoba menjalankannya go build mylib.gotetapi sepertinya tidak melakukan apa-apa (tidak ada file yang dihasilkan, tidak ada pesan kesalahan). Jadi ada ide bagaimana saya bisa melakukan ini?

laurent
sumber
Saya tidak menetapkan variabel GOPATH, hanya GOROOT.
laurent
1
jalankan di go installbawah direktori mylibpertama, dan coba lagi.
Joe
1
Lihat juga utas ini .
kostix
@ Jo, masih tidak bisa bekerja dengan menjalankan "go install" di dalam
hunter_tech

Jawaban:

175

Pertama, pastikan untuk membaca dan memahami dokumen "Bagaimana cara menulis kode Go" .

Jawaban aktual tergantung pada sifat "paket khusus" Anda.

Jika ini dimaksudkan untuk penggunaan umum, pertimbangkan untuk menggunakan apa yang disebut "tata letak kode Github" . Pada dasarnya, Anda menjadikan perpustakaan Anda go getproyek -tabel yang terpisah .

Jika pustaka Anda untuk penggunaan internal, Anda bisa seperti ini:

  1. Tempatkan direktori dengan file perpustakaan di bawah direktori proyek Anda.
  2. Di bagian lain dari proyek Anda, lihat perpustakaan menggunakan jalurnya relatif terhadap akar ruang kerja Anda yang berisi proyek.

Untuk menunjukkan:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Sekarang, di tingkat atas main.go, Anda bisa import "myproject/mylib"dan itu akan berhasil OK.

Kostix
sumber
1
Jika saya membuat proyek baru (myproject2) di bawah src /, bagaimana saya bisa mengimpor mylib?
Kiril
2
@ Kiril, maksud Anda, bagaimana Anda mengimpor mylibkode myproject2? Maka jawabannya adalah "dengan menggunakan import "myproject/mylib"- idenya adalah bahwa Go mencari jalur yang diimpor di bawah setiap direktori yang diekstrak dari GOPATHvariabel lingkungan (mereka disebut" ruang kerja "), tetapi pencarian ini (untungnya) tidak rekursif, jadi jalur tersebut adalah secara efektif "berlabuh" di ruang kerja masing-masing
kostix
4
Lain yang harus dibaca: "Nama paket" .
kostix
1
@MatthiasSommer, biasanya — dengan mengekstraksi mylib itu ke dalam paket umum yang digunakan setiap layanan microservice. Bagaimana "penggunaan" didefinisikan, tergantung pada alur kerja yang Anda inginkan. Dalam pengembangan tingkat perusahaan, pembatalan biasanya digunakan, tetapi dengan go modperkembangan terakhir , modul mungkin menjadi jawabannya (dan go modmendukung pembatalan modul juga).
kostix
1
@LeiYang, "paket yang akan diimpor" adalah direktori dengan satu atau lebih file sumber Go. Mengenai "bagaimana membangun paket ke file .ib" dan kemudian mengimpor file lib "- jawabannya tergantung pada apa yang Anda benar-benar ingin tanyakan. Jika Anda khawatir dengan kecepatan kompilasi, maka jangan takut: Go toolchain cache semua membangun hasil berdasarkan per-paket. Jika, sebaliknya, Anda ingin bertanya apakah mungkin untuk mengkompilasi dan mendistribusikan paket yang dikompilasi hanya biner, maka jawabannya adalah tidak .
kostix
68

Untuk jenis struktur folder ini:

main.go
mylib/
  mylib.go

Cara paling sederhana adalah dengan menggunakan ini:

import (
    "./mylib"
)
laurent
sumber
1
Ini tidak berfungsi lagi dalam versi terbaru karena paket tidak akan ditemukan. Impor yang benar adalah foo/mylib(dengan asumsi folder yang berisi main.go adalah foo).
nemo
6
@nemo, dengan versi terbaru dari go, saya selalu menggunakan "./mylib" dan berfungsi.
laurent
3
Menggunakan go 1.2 dan saya setuju dengan @ this.lau_
canadadry
8
Sadarilah bahwa ini membuat go installistirahat. Jika Anda sedang membangun proyek mandiri yang Anda ingin orang unduh dan jalankan go build, ini baik-baik saja - namun, saya akan menggunakan "tata letak kode Github" yang disebutkan di atas (bahkan jika off bitbucket, atau serupa) jika Anda ingin go installdukungan penuh .
photoionized
Saya menyarankan untuk tidak menggunakan cara ini. Ini akan merusak godef. godef tidak mengerti tentang "." import
King Jk
6

Untuk proyek yang dihosting di GitHub, inilah yang biasanya dilakukan orang:

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...
laike9m
sumber
6

Saya seorang programmer yang berpengalaman, tetapi, cukup baru di dunia Go! Dan saya akui saya menghadapi beberapa kesulitan untuk memahami Go ... Saya menghadapi masalah yang sama ketika mencoba mengatur file go saya di sub-folder. Cara saya melakukannya:

GO_Directory (yang ditugaskan ke $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

Pada File MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

pada file MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Saya menjalankan Go 1.9 di Ubuntu 16.04)

Dan ingat teman-teman, saya pemula di Go. Jika apa yang saya lakukan adalah praktik buruk, beri tahu saya!

Diego Favero
sumber
3

solusi lain:
tambahkan src/myproject$ GOPATH.

Kemudian import "mylib"akan dikompilasi.

Helin Wang
sumber
ini tidak akan berfungsi untuk jalur gettable go seperti paket yang diinangi github.
Gustav