গোলাংয়ে কোডের দীর্ঘ লাইনটি কীভাবে ভাঙ্গবেন?


111

পাইথন থেকে আসছি, আমি 80 টি কলামের বেশি লম্বা কোড লাইন দেখতে ব্যবহার করি না। সুতরাং যখন আমি এটির মুখোমুখি হই:

err := database.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

আমি এটি ভেঙে দেওয়ার চেষ্টা করেছি

err := database.QueryRow("select * from users where user_id=?", id) \
    .Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

তবে আমি পেয়েছি

 syntax error: unexpected \

আমি প্রবেশের সাথে হিট দিয়ে কেবল লাইনটি ভাঙার চেষ্টা করেছি এবং শেষে একটি সেমিকোলন রেখেছি:

err := database.QueryRow("select * from users where user_id=?", id) 
.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email);

তবে আমি আবার পেয়েছি:

syntax error: unexpected .

সুতরাং আমি ভাবছি যে এটি করার মতো গোলংিক উপায় কী?

উত্তর:


124

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

স্পেসিফিকেশন সঠিক নিয়ম তালিকাভুক্ত। স্পেস: সেমিকোলন:

আনুষ্ঠানিক ব্যাকরণে সেমিকোলন ব্যবহার করা হয় ";" বেশ কয়েকটি প্রোডাকশনে টার্মিনেটর হিসাবে। গো প্রোগ্রামগুলি নিম্নলিখিত দুটি নিয়ম ব্যবহার করে এই সেমিকোলনগুলির বেশিরভাগ বাদ দিতে পারে:

  1. ইনপুটটি টোকেনগুলিতে বিভক্ত হয়ে গেলে, একটি টেকনটি যদি লাইনটির চূড়ান্ত টোকেনের সাথে সাথেই সেমিকোলনটি স্বয়ংক্রিয়ভাবে টোকেন প্রবাহে প্রবেশ করা হয় if

  2. জটিল বিবৃতিগুলিকে একটি একক লাইন দখল করতে অনুমতি দেওয়ার জন্য, একটি বন্ধ "" "" "" বা "}" এর আগে একটি সেমিকোলন বাদ দেওয়া যেতে পারে।

সুতরাং আপনি দেখতে পাচ্ছেন যে আপনি প্রথম বন্ধনীটির পরে কোনও নতুন লাইন অক্ষর সন্নিবেশ করানো হলে ), একটি সেমিকোলন ;স্বয়ংক্রিয়ভাবে সন্নিবেশ করা হবে এবং সুতরাং পরবর্তী লাইনটি পূর্ববর্তী লাইনের ধারাবাহিকতা হিসাবে বিবেচিত হবে না। আপনার ক্ষেত্রে এটি ঘটেছে, এবং এরপরে শুরু হওয়া পরবর্তী লাইনটি .Scan(&ReadUser.ID,...আপনাকে একটি সংকলন-সময় ত্রুটি দেয় কারণ এটি নিজেই দাঁড়িয়ে থাকা (পূর্ববর্তী লাইনটি ছাড়াই) একটি সংকলন-সময় ত্রুটি:syntax error: unexpected .

সুতরাং আপনি যে কোনও সময়ে আপনার লাইনটি ভেঙে ফেলতে পারেন যা 1.উপরের পয়েন্টের নীচে তালিকাভুক্ত বিধিগুলির সাথে বিরোধ নয় conflict

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

i := 1 +
        2
fmt.Println(i) // Prints 3

এখানে লক্ষণীয় একটি বিষয় হ'ল যদি আপনার কাছে স্ট্রাকচার বা স্লাইস বা মানচিত্রের শাব্দিক প্রাথমিক মানগুলির তালিকা থাকে এবং আপনি সর্বশেষ মান তালিকাভুক্ত করার পরে লাইনটি ভাঙতে চান তবে আপনাকে একটি বাধ্যতামূলক কমা রাখতে হবে ,যদিও এটি সর্বশেষ মান এবং না আরও অনুসরণ করবে, যেমন:

s := []int {
    1, 2, 3,
    4, 5, 6,  // Note it ends with a comma
}

এটি সেমিকোলন নিয়মের সাথে সামঞ্জস্য করার জন্য, এবং এটিও যাতে আপনি চূড়ান্ত কমা যুক্ত / অপসারণের যত্ন না নিয়েই নতুন লাইনগুলি পুনরায় সাজানো এবং যুক্ত করতে পারেন; উদাহরণস্বরূপ, আপনি সরানো এবং একটি নতুন কমা যোগ না করেই কেবল 2 টি লাইন অদলবদল করতে পারেন:

s := []int {
    4, 5, 6,
    1, 2, 3,
}

একটি ফাংশন কলের আর্গুমেন্ট তালিকা করার সময় একই প্রযোজ্য:

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)

4
আমি জাভাস্ক্রিপ্ট লিটারালসের শেষে কমা রেখে চলেছি। # হেটেজ
পাওলো স্কার্ডাইন

29
টিএল; ডিআর: সাধারণত আপনি কমা পরে, আপনার লাইনগুলি ভেঙে ফেলতে পারেন, প্রথম বন্ধনীর উদ্বোধনের পরে ((, [, {, এবং একটি বিন্দুর পরে may যা কোনও মানের ক্ষেত্র বা পদ্ধতি উল্লেখ করতে পারে।)
পিটার কোক

4
শেষে অতিরিক্ত কমা যুক্ত করা আমার কিছু পুরানো আই জে বাগগুলি স্মরণ করিয়ে দেয়, ভয়ঙ্কর
ক্রিস্টোফ রাউসি

5
@ ক্রিস্টোফেরসি এটি সাবজেক্টিভ, আমি এক ভালবাসার জন্য যে সমস্ত লাইন কমা দিয়ে শেষ করতে হবে এবং কমা যোগ / অপসারণের যত্ন না নিয়েই আমি নতুন লাইনগুলিকে পুনর্বিন্যস্ত এবং সংযুক্ত করতে পারি।
আইজজা

@ আইকজা, আমি তাদেরও কমা দিয়ে শেষ করতে চাই, তবে শেষেরটি করা উচিত নয় :)
ক্রিস্টোফ রউসি

23

সহজ উপায় হ'ল .প্রথম লাইনে অপারেটরটি ( ) রেখে যাওয়া।

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


অপারেটরটি শেষে ছেড়ে যাওয়ার বিষয়ে ভাল পরামর্শ। এটা কাজ করেছে.
কার্লোম 18'16

4
প্রথম বন্ধনে আবরণ কাজ আফিকের কাজ করে না। বন্ধনীতে এখনও সেমিকোলনটি প্রবেশ করান
অ্যাড্রিয়ান শাম

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

@ রোল্যান্ডইলিগ এটি অবশ্যই কার্যকরভাবে কাজ করে: play.golang.org/p/oFKaxLTphU
tobyodavies

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

17

উল্লিখিত হিসাবে, এটি শৈলীর পছন্দের বিষয়। আমি বুঝতে পারি যে গো এর নির্মাতারা তাদের অভিজ্ঞতার উপর ভিত্তি করে একটি স্টাইলের পরামর্শ দিয়েছেন যা থেকে আমি শিখেছি তবে আমার অভিজ্ঞতা থেকে আমার নিজস্ব কিছু স্টাইলও রাখে।

নীচে আমি কীভাবে এটি ফর্ম্যাট করব:

err := database.
  QueryRow("select * from users where user_id=?", id).
  Scan(
    &ReadUser.ID,
    &ReadUser.Name,
    &ReadUser.First,
    &ReadUser.Last,
    &ReadUser.Email,
  )

16

এটি স্টাইলের বিষয়, তবে আমি পছন্দ করি:

err := database.QueryRow(
    "select * from users where user_id=?", id,
).Scan(
    &ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email,
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.