Go এ ট্যাগগুলির জন্য কী কী ব্যবহার (গুলি)?


392

ইন যান ভাষা নির্দিষ্টকরণ , এটা ট্যাগের সংক্ষিপ্ত উল্লেখ:

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

// A struct corresponding to the TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers.
struct {
  microsec  uint64 "field 1"
  serverIP6 uint64 "field 2"
  process   string "field 3"
}

এটি একটি খুব সংক্ষিপ্ত ব্যাখ্যা আইএমও, এবং আমি ভাবছিলাম যে এই ট্যাগগুলি কী ব্যবহার করবে তা যদি কেউ আমাকে সরবরাহ করতে পারে?


'শব্দার্থক' মন্তব্যগুলির ব্যবহারের জন্য আমার একটি সম্পর্কিত প্রশ্ন রয়েছে: স্ট্যাকওভারফ্লো
ব্রুস অ্যাডামস

সংশোধন করা হয়েছে যে লিঙ্কটি stackoverflow.com/q/53487371/1569204
ব্রুস অ্যাডামস

উত্তর:


641

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

যেমন ডকুমেন্টেশনে উল্লিখিত হয়েছে reflect.StructTag, কনভেনশন অনুসারে একটি ট্যাগ স্ট্রিংয়ের মান হ'ল জোড়গুলির স্থান-বিভাজিত তালিকা key:"value":

type User struct {
    Name string `json:"name" xml:"name"`
}

keyসাধারণত প্যাকেজ যে পরবর্তী নির্দেশ "value"জন্য জন্য উদাহরণ jsonকী প্রসেস করা হয় / দ্বারা ব্যবহৃত encoding/jsonপ্যাকেজ।

যদি একাধিক তথ্য পাস করতে হয় তবে "value"সাধারণত এটি কমা ( ',') দিয়ে আলাদা করে নির্দিষ্ট করা হয়

Name string `json:"name,omitempty" xml:"name"`

প্রক্রিয়াটি থেকে ক্ষেত্রটিকে বাদ দেওয়ার '-'জন্য সাধারণত একটি ড্যাশ মান ( ) এর "value"অর্থ হল ক্ষেত্রটি jsonমার্শাল বা আনমশাল নয় ma

প্রতিবিম্ব ব্যবহার করে আপনার কাস্টম ট্যাগ অ্যাক্সেস করার উদাহরণ

reflectস্ট্রাক্ট ক্ষেত্রগুলির ট্যাগ মানগুলিতে অ্যাক্সেস করতে আমরা প্রতিবিম্ব ( প্যাকেজ) ব্যবহার করতে পারি । মূলত Typeআমাদের আমাদের স্ট্রাক্টটি অর্জন করতে হবে এবং তারপরে আমরা ক্ষেত্রগুলি যেমন Type.Field(i int)বা এর সাথে কোয়েরি করতে পারি Type.FieldByName(name string)। এই পদ্ধতিগুলি এমন একটি মান দেয় StructFieldযা কোন স্ট্রাক্ট ক্ষেত্রের বর্ণনা / প্রতিনিধিত্ব করে; এবং StructField.Tagএমন একটি মান StructTagযা কোনও ট্যাগ মানকে বর্ণনা করে / উপস্থাপন করে।

পূর্বে আমরা "সম্মেলন" সম্পর্কে কথা বলেছিলাম । এই কনভেনশন মানে যদি আপনি এটি অনুসরণ আপনি ব্যবহার করতে পারে যে StructTag.Get(key string)পদ্ধতি যা একটি ট্যাগ এর মান parses এবং আপনি ফেরৎ "value"এর keyআপনি উল্লেখ করুন। এই পদ্ধতিতে কনভেনশনটি কার্যকর / নির্মিত হয় Get()। আপনি যদি কনভেনশনটি অনুসরণ Get()না করেন তবে জোড়াটি পার্স করতে পারবেন key:"value"এবং আপনি যা সন্ধান করছেন তা খুঁজে পাবেন না। এটিও কোনও সমস্যা নয়, তবে তারপরে আপনাকে নিজের পার্সিং যুক্তি প্রয়োগ করতে হবে।

এছাড়াও রয়েছে StructTag.Lookup()(Go 1.7 তে যুক্ত হয়েছিল) যা "লাইক Get()দিলেও প্রদত্ত কীটির সাথে ফাঁকা স্ট্রিং যোগ করে ট্যাগ থেকে প্রদত্ত কীটি না থাকা ট্যাগটিকে পৃথক করে"

সুতরাং আসুন একটি সহজ উদাহরণটি দেখুন:

type User struct {
    Name  string `mytag:"MyName"`
    Email string `mytag:"MyEmail"`
}

u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)

for _, fieldName := range []string{"Name", "Email"} {
    field, found := t.FieldByName(fieldName)
    if !found {
        continue
    }
    fmt.Printf("\nField: User.%s\n", fieldName)
    fmt.Printf("\tWhole tag value : %q\n", field.Tag)
    fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}

আউটপুট ( গো খেলার মাঠে এটি চেষ্টা করুন ):

Field: User.Name
    Whole tag value : "mytag:\"MyName\""
    Value of 'mytag': "MyName"

Field: User.Email
    Whole tag value : "mytag:\"MyEmail\""
    Value of 'mytag': "MyEmail"

গোফারকন 2015 এর স্ট্রাক্ট ট্যাগগুলি সম্পর্কে একটি উপস্থাপনা ছিল:

স্ট্রাক্ট ট্যাগের অনেকগুলি মুখ (স্লাইড) (এবং একটি ভিডিও )

এখানে সাধারণত ব্যবহৃত ট্যাগ কীগুলির একটি তালিকা রয়েছে:


28
দুর্দান্ত উত্তর। এই কর্মফলের দশ বারের চেয়ে এখানে আরও দরকারী তথ্য।
ডার্ট এগ্রিজিয়াস

2
খুব সুন্দর সংক্ষিপ্তসার!
স্টিভেনফারার 9:39

2
কি দুর্দান্ত উত্তর
আলবার্তো মেগিয়া

1
দুর্দান্ত উত্তর! ধন্যবাদ!
জাম্পআলওয়েজ

1
আশ্চর্যজনক উত্তর, এই সমস্ত তথ্যের জন্য আপনাকে ধন্যবাদ!
স্যাম হোমস

157

encoding/jsonএনকোডিং এবং ডিকোডিংয়ের সময় ক্ষেত্রগুলি কীভাবে ব্যাখ্যা করা হয় তা নিয়ন্ত্রণ করতে প্যাকেজটির সাথে ট্যাগ ব্যবহার করার একটি সহজ উদাহরণ এখানে রয়েছে :

সরাসরি চেষ্টা করুন: http://play.golang.org/p/BMeR8p1cKf

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    FirstName  string `json:"first_name"`
    LastName   string `json:"last_name"`
    MiddleName string `json:"middle_name,omitempty"`
}

func main() {
    json_string := `
    {
        "first_name": "John",
        "last_name": "Smith"
    }`

    person := new(Person)
    json.Unmarshal([]byte(json_string), person)
    fmt.Println(person)

    new_json, _ := json.Marshal(person)
    fmt.Printf("%s\n", new_json)
}

// *Output*
// &{John Smith }
// {"first_name":"John","last_name":"Smith"}

জসন প্যাকেজটি ক্ষেত্রের জন্য ট্যাগগুলি দেখতে পারে এবং কীভাবে জসন <=> স্ট্রাক্ট ফিল্ডটি মানচিত্র করতে হবে এবং জসনতে সিরিয়াল করার সময় খালি ক্ষেত্রগুলিকে অগ্রাহ্য করা উচিত কিনা এমন অতিরিক্ত বিকল্পগুলিও বলা যেতে পারে।

মূলত, যে কোনও প্যাকেজ ফিল মানগুলির প্রতিফলন ব্যবহার করে ট্যাগ মানগুলি দেখতে এবং সেই মানগুলিতে কাজ করতে পারে। তাদের সম্পর্কে প্রতিবিম্ব প্যাকেজে আরও কিছু তথ্য রয়েছে
http://golang.org/pkg/reflect/#StructTag :

কনভেনশন অনুসারে ট্যাগ স্ট্রিংগুলি optionচ্ছিকভাবে পৃথক পৃথক কী: "মান" জোড়গুলির সংমিশ্রণ। প্রতিটি কী হ'ল ফাঁকা স্ট্রিং যা স্থান (U + 0020 ''), কোট (U + 0022 '"), এবং কোলন (U + 003A': ') ব্যতীত নিয়ন্ত্রনবিহীন অক্ষরের সমন্বয়ে থাকে। প্রতিটি মান উদ্ধৃত হয় U + 0022 '"' অক্ষর এবং গো স্ট্রিং আক্ষরিক সিনট্যাক্স ব্যবহার করে।


6
জাভা টীকা জাতীয় মত?
ইসমাইল বাদোয়া

7
@ আইসদাবাদী: আমি জাভা লোক নই, তবে জাভা টীকাগুলির সংজ্ঞা সংক্ষিপ্ত নজরে, হ্যাঁ মনে হচ্ছে তারা একই লক্ষ্য অর্জন করছে; রানটাইমের সময় পরীক্ষা করা যায় এমন উপাদানগুলির সাথে মেটাডেটা সংযুক্ত করা।
jdi

15
সত্যিই জাভা টিকা নেই। জাভা টীকাগুলি টাইপ নিরাপদ এবং সংকলন সময় চেক করা হয় - গো স্ট্রিং আক্ষরিক নয়। গোলাং বেসিক মেটাডেটার বিধানগুলির তুলনায় জাভা টীকাগুলি অনেক বেশি শক্তিশালী এবং শক্তিশালী।
বসে

2
গো, এমজিওর জন্য মঙ্গোডিবি ড্রাইভারের অংশ হিসাবে, এর বিসন প্যাকেজেও ট্যাগ ব্যবহার করে (যা নিজেও ব্যবহার করতে পারে)। এটি আপনাকে বিএসএন কী উত্পন্ন করে তার উপর নির্ভুল নিয়ন্ত্রণ দেয়। Godoc.org/labix.org/v2/mgo/bson#pkg-files
Eno

1
জেএসওএন এবং বিএসওএন ছাড়াও কি অন্যান্য উদাহরণ রয়েছে?
ম্যাক্স হাইবার

1

এটি এমন এক ধরণের বিশেষ উল্লেখ যা প্যাকেজগুলিকে ট্যাগযুক্ত ক্ষেত্রের সাথে কীভাবে আচরণ করে তা নির্দিষ্ট করে treat

উদাহরণ স্বরূপ:

type User struct {
    FirstName string `json:"first_name"`
    LastName string `json:"last_name"`
}

json ট্যাগ jsonপ্যাকেজটিকে অবহিত করে যা নিম্নলিখিত ব্যবহারকারীর আউটপুট মার্শাল করে

u := User{
        FirstName: "some first name",
        LastName:  "some last name",
    }

এই মত হবে:

{"first_name":"some first name","last_name":"some last name"}

অন্য উদাহরণ হ'ল gormপ্যাকেজ ট্যাগগুলি ঘোষণা করে যে কীভাবে ডাটাবেস স্থানান্তর করতে হবে:

type User struct {
  gorm.Model
  Name         string
  Age          sql.NullInt64
  Birthday     *time.Time
  Email        string  `gorm:"type:varchar(100);unique_index"`
  Role         string  `gorm:"size:255"` // set field size to 255
  MemberNumber *string `gorm:"unique;not null"` // set member number to unique and not null
  Num          int     `gorm:"AUTO_INCREMENT"` // set num to auto incrementable
  Address      string  `gorm:"index:addr"` // create index with name `addr` for address
  IgnoreMe     int     `gorm:"-"` // ignore this field
}

Emailগোরম ট্যাগ সহ ফিল্ডের জন্য এই উদাহরণে আমরা ঘোষণা করি যে ফিল্ড ইমেলের জন্য ডাটাবেসে সংশ্লিষ্ট কলামটি অবশ্যই বারচর এবং 100 সর্বোচ্চ দৈর্ঘ্যের হতে হবে এবং এর অবশ্যই অনন্য সূচক থাকতে হবে।

অন্যান্য উদাহরণ হ'ল bindingট্যাগ যা বেশিরভাগ ginপ্যাকেজে ব্যবহৃত হয় ।

type Login struct {
    User     string `form:"user" json:"user" xml:"user"  binding:"required"`
    Password string `form:"password" json:"password" xml:"password" binding:"required"`
}


var json Login
if err := c.ShouldBindJSON(&json); err != nil {
     c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
     return
}

এই উদাহরণে বাইন্ডিং ট্যাগ জিন প্যাকেজটিকে ইঙ্গিত দেয় যে এপিআই-তে প্রেরিত ডেটাতে অবশ্যই ব্যবহারকারী এবং পাসওয়ার্ড ক্ষেত্র থাকতে হবে কারণ এই ক্ষেত্রগুলি প্রয়োজনীয় হিসাবে ট্যাগ হয়।

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

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