কীভাবে বিরক্তিকর ত্রুটি এড়ানো যায় "ঘোষিত এবং ব্যবহৃত হয় না"


238

আমি গো শিখছি তবে আমার মনে হচ্ছে এটি কিছুটা বিরক্তিকর যে সংকলন করার সময় আমার কোনও পরিবর্তনশীল বা প্যাকেজ অব্যবহৃত রাখা উচিত নয়।

এটি সত্যিই বেশ আমাকে ধীর করে দিচ্ছে। উদাহরণস্বরূপ, আমি কেবল একটি নতুন প্যাকেজ ঘোষণা করতে চেয়েছিলাম এবং এটি পরে ব্যবহার করার পরিকল্পনা করেছি বা পরীক্ষার জন্য কেবল কোনও আদেশকে আপত্তিহীন করেছিলাম। আমি সর্বদা ত্রুটি পাই এবং সেগুলি ব্যবহারের জন্য সমস্ত মন্তব্য করা দরকার।

গো এ ধরণের চেক এড়াতে কোন উপায় আছে?


1
আপনার জন্য আমদানি স্বয়ংক্রিয়ভাবে যোগ / অপসারণ করতে আপনি গিম্পোর্টস ( Godoc.org/code.google.com/p/go.tools/cmd/goimports ) ব্যবহার করতে পারেন।
এলিথার


3
আমি এখনও মনে করি একটি সংকলক বিকল্প কার্যপ্রবাহ "ডিবাগিংয়ে সহায়তা করতে কিছু মন্তব্য করতে চাই" এর জন্য কার্যকর হবে।
আরজেফালকোনার

13
এই বৈশিষ্ট্যটি মানুষের সময়কে নষ্ট করার একটি দুর্দান্ত উপায়, কী কথা? আপনি যখন / শিপ কোডটি প্রতিশ্রুতিবদ্ধ করবেন, ঠিক আছে কোনও অব্যবহৃত ভার্স ভাল নয়, তবে এটি বিকাশ করার সময়? ভয়ঙ্কর।
আলেকজান্ডার মিলস

এটি ২০২০ এবং আমি বিশ্বাস করতে পারি না তারা এখনও এটি স্থির করেনি (এমনকি সংকলক পতাকার সাথেও নয়)। আমি প্রায় 5 বছর আগে গোতে একটি প্রকল্প করেছি এবং সামগ্রিকভাবে ভাষাটি পছন্দ করেছে তবে এটি কেবল আমার কারণে অযোগ্য। আমি যেভাবে কোড করি আমি ক্রমাগতভাবে মন্তব্য / আপত্তিহীন স্টাফ রাখি, তাই গোতে এই "বৈশিষ্ট্য" জিনিসগুলিকে আমার দ্বিগুণ সময় দেয় ... আমি তখন থেকে প্রতি কয়েকমাস পরপর পরীক্ষা করে দেখছি যে কোনও কারণবোধটি ছাপিয়ে গেছে কিনা তা দেখার জন্য I've গো দল, এবং এখনও ভাগ্য নেই ... স্তন্যপান। এটি অন্যথায় দুর্দান্ত ভাষা এবং আমি এটি আরও বেশি ব্যবহার করতে চাই তবে বর্তমানে এটি আমার পক্ষে ব্যবহারযোগ্য নয়।
রুসলান

উত্তর:


234

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

তবে, যদি আপনি সত্যিই এই ত্রুটিটি এড়াতে চান তবে আপনি ফাঁকা শনাক্তকারী ( _) ব্যবহার করতে পারেন :

package main

import (
    "fmt" // imported and not used: "fmt"
)

func main() {
    i := 1 // i declared and not used
}

হয়ে

package main

import (
    _ "fmt" // no more error
)

func main() {
    i := 1 // no more error
    _ = i
}

নীচের মন্তব্যে কোস্টিক্স বলেছিলেন, আপনি FA দলের মধ্যে গো দলের অফিসিয়াল অবস্থান জানতে পারেন :

অব্যবহৃত ভেরিয়েবলের উপস্থিতি একটি বাগ নির্দেশ করতে পারে, যখন অব্যবহৃত আমদানি কেবল সংকলনটি ধীর করে দেয়। আপনার কোড ট্রিতে পর্যাপ্ত অব্যবহৃত আমদানি জমা করুন এবং জিনিসগুলি খুব ধীরে ধীরে পেতে পারে। এই কারণে, গো উভয়ই অনুমতি দেয় না।


90
তবুও, এটির মন্তব্য করা থেকে এটি এতটা আলাদা নয়। এবং আমি বুঝতে পেরেছি যে এটি আরও ভাল কোডের জন্য, তবে আমরা যদি আমাদের কোডটি পরীক্ষা করে কেন একটি চেক বন্ধ করতে পারি এবং আমরা কোডটি শেষ করে এটি পরিষ্কার করতে চাই তার পরে আবার এই চেকটি খুলতে পারি তবে কী ভাল হয়?
এ-লেটব্বি

21
@ কোস্টিক্স ওয়েল .. এটি আপনাকে কমিয়ে দেবে না কারণ আপনি হয়ত বিশেষজ্ঞ হতে পারেন তবে এটি আমার পক্ষে এবং আমি যেভাবে কোডিং করছি। আমি ভাবছি আরও ভাল উপায় আছে কিনা। তবে যাইহোক, FAQ এর জন্য ধন্যবাদ! এটি পড়ে, আমি পুরোপুরি বুঝতে পারি যে কী কারণে গোলং এইভাবে করছে।
এ-লেটবি

20
এটি বন্ধ করার জন্য কি কোনও কমান্ড-লাইন যুক্তি রয়েছে? বা এটি একটি পরিবর্তনযোগ্য বৈশিষ্ট্য?
এথান বিয়ারলাইন

26
এফডব্লিউআইডাব্লু, অন্যের কোড পড়ার সময় আমি খুব খারাপ করেছি, তবে অব্যবহৃত চিহ্নগুলির কারণে অবশ্যই তা নয়। ওতো, এই * #% $ গোলং "বৈশিষ্ট্য" র সাথে মোকাবিলা করার পদ্ধতিগুলি তদন্ত করার জন্য আমি আজ এক ঘন্টা হারিয়েছি।
টর্স্টেন ব্রোঞ্জার 21

24
দুঃখজনকভাবে এই উত্তরটি সঠিক - তবে এটি এটি ন্যায়সঙ্গত করে না। কোড চেক করা এবং কেবল এটি সম্পাদন করার মধ্যে পার্থক্য রয়েছে world আমরা কোডটি চেক করে নিলে আমরা এই ধরণের ত্রুটি ধরতে লন্টার ব্যবহার করি। যখন আমরা দ্রুত বিকাশের সময় নির্বাহ করি তখন আমাদের একই মান হয় না। লিন্টারের সাথে একটি সংকলককে বিভ্রান্ত করা ক্ষমাহীন। এমনকি গুগলের অভ্যন্তরে স্টাইলের পুলিশও ভুল করে না।
ট্র্যাভিস উইলসন

29

আপনি এটির জন্য একটি সাধারণ "নাল ফাংশন" ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

func Use(vals ...interface{}) {
    for _, val := range vals {
        _ = val
    }
}

যা আপনি এর মতো ব্যবহার করতে পারেন:

package main

func main() {
    a := "declared and not used"
    b := "another declared and not used"
    c := 123

    Use(a, b, c)
}

এর জন্য একটি প্যাকেজও রয়েছে যাতে আপনাকে Useপ্রতিবার ফাংশনটি সংজ্ঞায়িত করতে হবে না :

import (
  "github.com/lunux2008/xulu"
)

func main() {
  // [..]

  xulu.Use(a, b, c)
}

29

এফএকিউ অনুসারে :

কেউ কেউ এই চেকগুলি বন্ধ করতে বা কমপক্ষে তাদের সতর্কবাণীতে কমাতে সংকলক বিকল্প চেয়েছে। যদিও এই জাতীয় বিকল্প সংযোজন করা হয়নি, কারণ সংকলক বিকল্পগুলি ভাষার শব্দার্থকে প্রভাবিত করে না এবং গো সংকলক সতর্কতাগুলির প্রতিবেদন করে না, কেবল ত্রুটিগুলি যা সংকলন প্রতিরোধ করে।

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

আমি অগত্যা এটির সাথে বিভিন্ন কারণে প্রবেশ করার পক্ষে উপযুক্ত নয় এর সাথে একমত নই। এটি এটি যা এবং এটি অদূর ভবিষ্যতে কোনও পরিবর্তন হওয়ার সম্ভাবনাও নেই।

প্যাকেজগুলির জন্য, এমন একটি goimportsসরঞ্জাম রয়েছে যা স্বয়ংক্রিয়ভাবে অনুপস্থিত প্যাকেজগুলি যুক্ত করে এবং অব্যবহৃত প্যাকেজগুলি সরিয়ে দেয়। উদাহরণ স্বরূপ:

# Install it
$ go get golang.org/x/tools/cmd/goimports

# -w to write the source file instead of stdout
$ goimports -w my_file.go

আপনার যে কোনও অর্ধপথের শালীন সম্পাদক থেকে এটি চালানো উচিত - উদাহরণস্বরূপ ভিমের জন্য:

:!goimports -w %

goimportsপৃষ্ঠা তালিকা অন্য সম্পাদকদের জন্য কিছু কমান্ড, এবং আপনি সাধারণত এটি সেট স্বয়ংক্রিয়ভাবে ডিস্কে বাফার সংরক্ষণ যখন আপনি চালাতে হবে।

নোট যে goimportsচালানো হবে gofmt


যেমনটি আগেই উল্লেখ করা হয়েছিল, ভেরিয়েবলের জন্য সবচেয়ে সহজ উপায় হ'ল (অস্থায়ীভাবে) তাদের এগুলি নিযুক্ত করা _:

// No errors
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible

9

একটি কোণ এখনও অবধি উল্লেখ নেই কোড সম্পাদনা করার জন্য ব্যবহৃত সরঞ্জাম সেট।

ব্যবহার ভিসুয়াল স্টুডিও কোড থেকে এক্সটেনশন সহ lukehoban নামক Goআপনার জন্য কিছু অটো-জাদু করতে হবে। গো এক্সটেনশানটি স্বয়ংক্রিয়ভাবে চলমান gofmt, golintইত্যাদি, এবং মুছে ফেলা এবং importএন্ট্রি যুক্ত করে । কমপক্ষে সেই অংশটি এখন স্বয়ংক্রিয়।

আমি প্রশ্নের সমাধানের 100% নয়, তবে এটি যথেষ্ট কার্যকর হিসাবে স্বীকার করব।


8

অন্যরা যদি এটিকে বোঝার জন্য কঠিন সময় ব্যয় করে তবে আমি মনে করি এটি খুব সহজ শর্তে এটি ব্যাখ্যা করতে সহায়তা করবে। আপনার যদি এমন কোনও ভেরিয়েবল থাকে যা আপনি ব্যবহার করেন না, উদাহরণস্বরূপ এমন একটি ফাংশন যার জন্য আপনি অনুরোধটি মন্তব্য করেছিলেন (একটি সাধারণ ব্যবহারের ক্ষেত্রে):

myFn := func () { }
// myFn()

আপনি ফাংশনে একটি অকেজো / ফাঁকা পরিবর্তনশীল বরাদ্দ করতে পারেন যাতে এটি আর অব্যবহৃত থাকে :

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