একই ফোল্ডারে গো ফাইলগুলি আমদানি করা হচ্ছে


86

স্থানীয় গো ফাইলটি অন্য গো ফাইলে আমদানি করতে আমার অসুবিধা হচ্ছে।

আমার প্রকল্প কাঠামো নীচের মত কিছু

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

আমি b.go এর ভিতরে a.go আমদানি করার চেষ্টা করছি আমি নিম্নলিখিত চেষ্টা করেছিলাম,

import "a"
import "github.com/xxxx/a"

এগুলির কোনওটিই কাজ করেনি .. আমি বুঝতে পারি আমাকে GOPATH এর সাথে হস্তক্ষেপ করতে হবে তবে আমি এটি সঠিকভাবে পেতে পারি নি। বর্তমানে আমার গোপ্যাথ স্যাম্পলগো (/ ওয়ার্কস্পেস / স্যাম্পেলগো) এর দিকে নির্দেশ করছে। আমি নীচের ত্রুটি পেয়েছি

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

এছাড়াও, যখন এই উত্স ফাইলগুলি অন্য প্রকল্প / মডিউলে আমদানি করা হয় তখন গোপথ কীভাবে কাজ করবে? স্থানীয় আমদানি কি তখন সমস্যা হয়ে দাঁড়াবে? এক্ষেত্রে সেরা অনুশীলনটি কী - মডিউলে (সম্পর্কিত পরীক্ষাগুলির সাথে) কেবলমাত্র একটি গো ফাইল রাখা উচিত?


ডিরেক্টরিতে যে কোনও সংখ্যক ফাইলই শুরু থেকে একই প্যাকেজের অংশ। (এবং তাদের package aউপরে শীর্ষে একই ঘোষণা থাকা দরকার ))
টোভটওটো

ধন্যবাদ @ টটওয়টওয়ো ... উপরের সমস্যাটি কীভাবে সমাধান করবেন তা আপনি আমাকে জানাতে পারেন? এছাড়াও, যখন আমাদের প্যাকেজে মাল্টিপ গো গো ফাইল থাকে আমদানি করা উচিত পুরো পথ অনুসরণ করা। github.com/xxxx/a বা ঠিক একটি করণীয়
g0c00l.g33k

গো মডিউলগুলির জন্য, একই ডিরেক্টরিতে থাকা ফাইলগুলি এখনও একই প্যাকেজের অংশ, এখনও একই প্যাকেজের নাম থাকা দরকার (যেমন, package foo) এবং এখনও একে অপরকে সরাসরি আমদানি করার প্রয়োজন হয় না। গো মডিউলগুলির অধীনে একই মডিউলে কীভাবে প্যাকেজ আমদানি করা যায় সেজন্য গো মডিউলগুলির জন্য এই উত্তরটি আরও কিছুটা কভার করে।
182

উত্তর:


79

ডিরেক্টরিতে যে কোনও সংখ্যক ফাইল হ'ল একক প্যাকেজ; একটি ফাইলে ঘোষিত প্রতীকগুলি কোনও importএস বা যোগ্যতা ছাড়াই অন্যদের কাছে উপলব্ধ । সমস্ত ফাইলের package fooশীর্ষে একই ঘোষণার প্রয়োজন হয় (অথবা আপনি এর থেকে ত্রুটি পাবেন go build)।

তোমার দরকার কি? GOPATHডিরেক্টরি যেখানে আপনার সেট pkg, srcএবং binডিরেক্টরি বসবাস করেন। এটি কেবল পছন্দের বিষয়, তবে আপনার সমস্ত অ্যাপ্লিকেশনের জন্য (কখনও কখনও $HOME) একক ওয়ার্কস্পেস থাকা সাধারণ , অ্যাপ্লিকেশন প্রতি এক নয়।

সাধারণত একটি গিথুব পাথ হবে github.com/username/reponame(কেবল নয় github.com/xxxx)। সুতরাং আপনি mainএবং অন্য একটি প্যাকেজ পেতে চাইলে আপনি workspace/srcপছন্দ মতো কিছু করতে পারেন

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

নোট করুন আপনি সর্বদা পুরো github.com/...পথ দিয়ে আমদানি করুন : কোনও ওয়ার্কস্পেসে আপেক্ষিক আমদানির অনুমতি নেই। আপনি যদি টাইপিং পাথগুলি ক্লান্ত করে থাকেন তবে ব্যবহার করুন goimports। আপনি যদি go runএটির সাথে তাল মিলিয়ে যাচ্ছিলেন , তবে এটি এখন স্যুইচ করার সময় এসেছে go build: runএকাধিক ফাইলের সাথে খারাপ ব্যবহার করে mainএবং আমি পরীক্ষার জন্য বিরক্ত করিনি তবে শুনেছি (ডেভ চেনি থেকে এখানে ) go runনোংরা নির্ভরতা পুনর্নির্মাণ করে না।

আপনি কমপক্ষে GOPATH কে সঠিক জিনিসটিতে সেট করার চেষ্টা করেছেন বলে মনে হচ্ছে, সুতরাং যদি আপনি এখনও আটকে থাকেন তবে সম্ভবত আপনি পরিবেশের পরিবর্তনশীল (কমান্ড ইত্যাদি) কীভাবে সেট করেছেন এবং কোন আদেশটি আপনি চালিয়েছেন এবং কী কী ত্রুটি ঘটেছে তা অন্তর্ভুক্ত করতে পারেন। এখানে কিভাবে এটা সেট করতে (এবং সেটিং অনড়) লিনাক্স / ইউনিক্স অধীনে নির্দেশাবলী হয় এবং এখানে কর্মক্ষেত্র সেটআপ যান দলের উপদেশ । হতে পারে না কোনও সাহায্য করে না, তবে একবার দেখে নিন এবং আপনি যদি বিভ্রান্ত হন তবে কমপক্ষে কোন অংশটি আপনাকে বিভ্রান্ত করে তা নির্দেশ করুন।


4
goimports বেশ সহায়ক ছিল :)
g0c00l.g33k

আপনার যদি প্রধান প্যাকেজে একাধিক ফাইল চালাতে সমস্যা হয় তবে এই উত্তরটি দেখুন
রিক স্মিথ

আমি package mainএকই ডিরেক্টরিতে সমস্ত ফাইলগুলিতে একই ঘোষণা যুক্ত করেছি , তবে আমার undefinedত্রুটি রয়েছে, একই ডিরেক্টরিতে main.goথাকা ফাইল থেকে ফাংশনগুলি দেখতে পাচ্ছি না controllers.go
এমএম

4
@ অ্যালেক্সচালি আপনি যদি ব্যবহার করছেন তবে আপনার go runউভয় ফাইলের নামটি স্পষ্টভাবে প্রেরণের প্রয়োজন হতে পারে বা এগুলি আপনার গোপথে কোনও প্যাকেজে রাখার জন্য এবং go buildএটির প্রবেশের পরিবর্তে যেতে হবে। এছাড়াও প্যাকেজ কাঠামোর সাথে সম্পর্কিত না হওয়া সাধারণ ত্রুটির জন্য ডাবল-চেক করুন (টাইপ করা নামের মতো)। যদি এর কোনওটিই সমাধান না করে, আপনি যা যা করতে পারেন তার বিশদ দিয়ে আমি একটি নতুন প্রশ্ন খুলব; আপনার দির, ফাইল ইত্যাদি কীভাবে সমাধান করা উচিত তা অবিকলভাবে আলোচনা হতে পারে এবং যেহেতু এটি আপনার সেটআপ সম্পর্কে সুনির্দিষ্টভাবে থাকত তবে একটি নতুন প্রশ্ন সেটির সেরা ভেন্যুর মতো মনে হচ্ছে।
twotwotwo

41

হিসাবে আপনি উভয় ডিক্লেয়ার কোন আমদানি যতদিন প্রয়োজন a.goএবং b.goএকই প্যাকেজের মধ্যে যাবে। তারপরে, আপনি এর go runসাথে একাধিক ফাইলগুলি সনাক্ত করতে ব্যবহার করতে পারেন :

$ go run a.go b.go

14

./main.go (প্যাকেজ
প্রধানতে ) ./a/a.go (প্যাকেজ এ)
./a/b.go (প্যাকেজ এ)

এই ক্ষেত্রে:
main.go আমদানি "./a"

এটি a.go এবং b.go এ ফাংশনটি কল করতে পারে, যেটিতে প্রথম অক্ষরের ক্যাপ লাগানো থাকে।


0

আমি কেবল প্রধান 28 ফেব্রুয়ারীর জবাবের মতো কিছু ফাইল মুখ্য ফোল্ডার থেকে সরিয়ে নেওয়ার জন্য কিছু প্রাথমিক বিষয় চেয়েছিলাম তবে তার নির্দিষ্ট উত্তরটি আমার পক্ষে কার্যকর হয়নি। তারা যদি একই প্যাকেজে থাকত বা না থাকত আমি সেদিকে খেয়াল রাখিনি।

আমার গোপথ ওয়ার্কস্পেস c:\work\goএবং তার অধীনে আমার রয়েছে

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

মধ্যে main.goআমি import "/pg/dbtypes"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.