খালি স্ট্রাক্টের জন্য কীভাবে চেক করবেন?


110

আমি একটি কাঠামো সংজ্ঞায়িত করি ...

type Session struct {
    playerId string
    beehive string
    timestamp time.Time
}

কখনও কখনও আমি এটিতে একটি খালি অধিবেশন বরাদ্দ করি (কারণ শূন্য করা সম্ভব নয়)

session = Session{};

তারপরে আমি যাচাই করতে চাই, এটি খালি কিনা:

if session == Session{} {
     // do stuff...
}

স্পষ্টতই এটি কাজ করছে না। আমি কীভাবে এটি লিখব?


4
সেশন} an একটি "খালি" সেশন নয়; এটি প্রতিটি ক্ষেত্রের শূন্য মান হওয়ায় এটি শুরু করা।
পল হানকিন

উত্তর:


177

আপনি শূন্য মানের যৌগিক আক্ষরিকের সাথে তুলনা করতে == ব্যবহার করতে পারেন কারণ সমস্ত ক্ষেত্র তুলনীয় :

if (Session{}) == session  {
    fmt.Println("is zero value")
}

খেলার মাঠের উদাহরণ

পার্সিং অস্পষ্টতার কারণে if শর্তে সম্মিলিত আক্ষরিক চারপাশে প্রথম বন্ধনী আবশ্যক।

==উপরের ব্যবহারটি এমন স্ট্রাইকগুলিতে প্রযোজ্য যেখানে সমস্ত ক্ষেত্র তুলনীয় । যদি স্ট্রাক্টটিতে তুলনামূলক অযোগ্য ক্ষেত্র থাকে (স্লাইস, মানচিত্র বা ফাংশন), তবে ক্ষেত্রগুলিকে একে একে তাদের শূন্য মানের সাথে তুলনা করতে হবে।

সম্পূর্ণ মানটির সাথে তুলনা করার বিকল্প হ'ল একটি ক্ষেত্রের সাথে তুলনা করা যা বৈধ সেশনে একটি শূন্য-না মানতে সেট করা আবশ্যক। উদাহরণস্বরূপ, যদি বৈধ সেশনে প্লেয়ার আইডি অবশ্যই হয়! = "", ব্যবহার করুন

if session.playerId == "" {
    fmt.Println("is zero value")
}

4
@ ক্রিস্টেন ডেরিফারেন্স পয়েন্টার এবং তুলনা করুন। যদি sessionনন-শূন্য হয় *Session, তবে ব্যবহার করুন if (Session{} == *session {
মাফিন শীর্ষ

3
সুতরাং আমি একটি ত্রুটি পেয়েছি struct containing []byte cannot be compared, কারণ, ভাল, আমার স্ট্রাক্টটিতে একটি বাইট স্লাইস রয়েছে।
নেওয়ারমোর

14
@ নেভারমোর উত্তর তুলনীয় ক্ষেত্রগুলির সাথে কাঠামোর ক্ষেত্রে প্রযোজ্য। যদি আপনার স্ট্রাক্টে [] বাইটের মতো তুলনামূলক মান থাকে তবে আপনার সমস্ত ক্ষেত্র পরীক্ষা করার জন্য কোড লিখতে হবে বা অন্য উত্তরে বর্ণিত প্রতিফলিত প্যাকেজটি ব্যবহার করতে হবে।
মাফিন শীর্ষ

2
@ নেভারমোর দ্বারা উল্লিখিত হিসাবে, ==স্লাইস ক্ষেত্রের সাথে তুলনা ব্যর্থ হবে। এই structs মধ্যে, ব্যবহারের তুলনা জন্য পারেন reflect.DeepEqual: বা কিছু আরো ভালো এখানে আলোচনা বিশেষ বিবেচনা stackoverflow.com/questions/24534072/...
asgaines

"[যদি শর্তে]" অস্পষ্টতাকে পার্সিং করে "আমার দিনটি বাঁচিয়েছিল, ধন্যবাদ :) কোজ যখন আমি এফএমটি.প্রিন্টনে (সেশন == সেশন}}) চেষ্টা করছিলাম তখন এটি কার্যকর হয়।
ফ্রানভা

37

এখানে আরও 3 টি পরামর্শ বা কৌশল রয়েছে:

একটি অতিরিক্ত ক্ষেত্র সহ

স্ট্রাক্টটি জনবহুল হয়েছে কি না তা খালি কিনা তা জানানোর জন্য আপনি একটি অতিরিক্ত ক্ষেত্র যুক্ত করতে পারেন। আমি ইচ্ছাকৃতভাবে এটির নামকরণ করেছি readyনা emptyকারণ একটি এর শূন্য মান boolহল false, তাই আপনি যদি Session{}এর readyক্ষেত্রের মতো একটি নতুন কাঠামো তৈরি করেন তবে falseএটি স্বয়ংক্রিয়ভাবে আসবে এবং এটি আপনাকে সত্যটি বলে দেবে: যে কাঠামোটি এখনও প্রস্তুত নয় (এটি খালি)।

type Session struct {
    ready bool

    playerId string
    beehive string
    timestamp time.Time
}

আপনি যখন কাঠামোটি আরম্ভ করবেন তখন আপনাকে সেট readyকরতে হবে true। আপনার isEmpty()পদ্ধতির আর প্রয়োজন নেই (যদিও আপনি চাইলে একটি তৈরি করতে পারেন) কারণ আপনি কেবল readyক্ষেত্রটি নিজেই পরীক্ষা করতে পারেন ।

var s Session

if !s.ready {
    // do stuff (populate s)
}

boolকাঠামো বড় হওয়ার সাথে সাথে এটিতে ক্ষেত্রগুলি তুলনীয় নয় (উদাহরণস্বরূপ স্লাইস mapএবং ফাংশন মান) এর সাথে এটির অতিরিক্ত ক্ষেত্রের তাত্পর্য বৃদ্ধি পায় ।

একটি বিদ্যমান ক্ষেত্রের জিরো মান ব্যবহার করে

এটি পূর্ববর্তী পরামর্শের মতো, তবে এটি বিদ্যমান ক্ষেত্রের শূন্য মান ব্যবহার করে যা বিবেচিত হয় স্ট্রাকটি খালি না হলে অবৈধ হয়। এর ব্যবহার বাস্তবায়ন নির্ভর।

উদাহরণস্বরূপ যদি আপনার উদাহরণে আপনার playerIdখালি হতে পারে নাstring "" , আপনি এটির জন্য এটি ব্যবহার করতে পারেন যদি আপনার স্ট্রাক্টটি থাকে:

var s Session

if s.playerId == "" {
    // do stuff (populate s, give proper value to playerId)
}

এই ক্ষেত্রে এটিতে এই চেকটি অন্তর্ভুক্ত করা উচিত isEmpty() পদ্ধতিতে কারণ এই চেকটি বাস্তবায়ন নির্ভর করে:

func (s Session) isEmpty() bool {
    return s.playerId == ""
}

এবং এটি ব্যবহার:

if s.isEmpty() {
    // do stuff (populate s, give proper value to playerId)
}

আপনার কাঠামোতে পয়েন্টার ব্যবহার করুন

দ্বিতীয় প্রস্তাব আপনার struct একটি পয়েন্টার ব্যবহার করতে হয়: *Session। পয়েন্টারগুলির nilমান থাকতে পারে , সুতরাং আপনি এটির জন্য পরীক্ষা করতে পারেন:

var s *Session

if s == nil {
    s = new(Session)
    // do stuff (populate s)
}

দুর্দান্ত উত্তর। ধন্যবাদ, আইজজা!
ইভজেনি গোল্ডিন

দুর্দান্ত উত্তর! আমি মনে করি শেষ পছন্দটি অনুসরণ করা বেশ মূর্তিমান দেখাচ্ছে।
দেভিভিনসন টেজেদা

19

রিফ্লেক্ট.ডিপইকুয়াল ব্যবহার করাও কাজ করে , বিশেষত যখন আপনার কাঠামোর ভিতরে মানচিত্র থাকে

package main

import "fmt"
import "time"
import "reflect"

type Session struct {
    playerId string
    beehive string
    timestamp time.Time
}

func (s Session) IsEmpty() bool {
  return reflect.DeepEqual(s,Session{})
}

func main() {
  x := Session{}
  if x.IsEmpty() {
    fmt.Print("is empty")
  } 
}

2
প্রতিবিম্ব ব্যবহার করে। ডিপএকুয়াল একটি খুব পরিষ্কার সমাধান তবে আমি আশ্চর্য হয়েছি যে এটি আরও প্রসেসিংয়ের সময় নেয় কিনা? আমি ধরে নিলাম এটি প্রতিটি ক্ষেত্রের সাথে তুলনা করছে, এবং আপনি একটি নতুন আমদানি প্রবর্তন করছেন।
তুরস্ক করুন

4

মনে রাখবেন যে স্ট্রাকচারের পয়েন্টারগুলির সাহায্যে আপনাকে ভেরিয়েবলটি অবলম্বন করতে হবে এবং খালি কাঠামোর সাথে এটি কোনও পয়েন্টারের সাথে তুলনা করতে হবে:

session := &Session{}
if (Session{}) == *session {
    fmt.Println("session is empty")
}

এই খেলার মাঠ পরীক্ষা করুন ।

এছাড়াও এখানে আপনি দেখতে পাচ্ছেন যে কোনও সম্পত্তি সম্বলিত স্ট্রাক্ট যা পয়েন্টারগুলির একটি স্লাইস, একইভাবে তুলনা করা যায় না ...


0

অন্যান্য উত্তরের বিকল্প হিসাবে, আপনি মূলত যেভাবে উদ্দেশ্যটির caseচেয়ে একটি বিবৃতি দিয়ে তা করাতে চাইলে মূলত: এর অনুরূপ একটি সিনট্যাক্স দিয়ে এটি করা সম্ভব if:

session := Session{}
switch {
case Session{} == session:
    fmt.Println("zero")
default:
    fmt.Println("not zero")
}

খেলার মাঠের উদাহরণ


0

মাত্র একটি দ্রুত সংযোজন, কারণ আমি আজ একই সমস্যাটি মোকাবিলা করেছি:

Go 1.13 এর মাধ্যমে নতুন isZero()পদ্ধতিটি ব্যবহার করা সম্ভব :

if reflect.ValueOf(session).IsZero() {
     // do stuff...
}

আমি পারফরম্যান্স সম্পর্কিত এটি পরীক্ষা করিনি, তবে আমি অনুমান করি যে এটির তুলনা করার চেয়ে এটি আরও দ্রুত হওয়া উচিত reflect.DeepEqual()


-1

মত হতে পারে কিছু এই

package main

import "fmt"
import "time"

type Session struct {
    playerId string
    beehive string
    timestamp time.Time
}

func (s Session) Equal(o Session) bool {
   if(s.playerId != o.playerId) { return false }
   if(s.beehive != o.beehive) { return false }
   if(s.timestamp != o.timestamp) { return false }
   return true
}

func (s Session) IsEmpty() bool {
    return s.Equal(Session{})
}

func main() {
    x := Session{}
    if x.IsEmpty() {
       fmt.Print("is empty")
    } 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.