ইন্টারফেস meaning} এর অর্থ কী?


133

আমি ইন্টারফেসে নতুন এবং গিথুব দ্বারা এসওএপি অনুরোধ করার চেষ্টা করছি

আমি এর অর্থ বুঝতে পারছি না

Msg interface{}

এই কোডে:

type Envelope struct {
    Body `xml:"soap:"`
}

type Body struct {
    Msg interface{}
}

আমি একই বাক্য গঠনটি পর্যবেক্ষণ করেছি

fmt.Println

তবে বুঝতে পারছেন না কী অর্জন করা হচ্ছে

interface{}

20
interface{}কমপক্ষে void *সি এর সমতুল্য এটি কোনও কিছুর প্রতি নির্দেশ করতে পারে এবং এটি ব্যবহারের জন্য আপনার কাছে একটি castালাই / প্রকারের দৃ .়তা প্রয়োজন।
নিক ক্রেগ-উড

ইন্টারফেস meaning} এর অর্থ কী? স্ট্যাকওভারফ্লো . com/a/62337836/12817546 দেখুন ।
টম জে

উত্তর:


189

আপনি " গোয়ায় ইন্টারফেসগুলি কীভাবে ব্যবহার করবেন " (" ইন্টারফেসের রাশ কক্সের বর্ণনার উপর ভিত্তি করে)" নিবন্ধটি উল্লেখ করতে পারেন :

কি হল একটি ইন্টারফেস?

একটি ইন্টারফেস দুটি জিনিস:

  • এটি পদ্ধতির একটি সেট,
  • তবে এটিও এক প্রকার

interface{}ধরন, খালি ইন্টারফেস ইন্টারফেস কে কোন পন্থা রয়েছে।

যেহেতু কোনও প্রয়োগ কীওয়ার্ড নেই, তাই সমস্ত প্রকারের কমপক্ষে শূন্য পদ্ধতি প্রয়োগ করে এবং একটি ইন্টারফেসকে সন্তুষ্ট করে স্বয়ংক্রিয়ভাবে সম্পন্ন করা হয়, সমস্ত ধরণের খালি ইন্টারফেসটি সন্তুষ্ট করে
এর অর্থ হ'ল আপনি যদি কোনও ফাংশন লিখেন যা interface{}প্যারামিটার হিসাবে একটি মান নেয় , আপনি যে ফাংশনটি কোনও মান দিয়ে সরবরাহ করতে পারেন

(এটি Msgআপনার প্রশ্নের প্রতিনিধিত্ব করে: কোনও মান)

func DoSomething(v interface{}) {
   // ...
}

এখানে বিভ্রান্তিকর হয়ে ওঠে এখানে:

DoSomethingফাংশনের ভিতরে কি vধরণের?

শিক্ষানবিস গোফারদের বিশ্বাস করা হয় যে "যে vকোনও ধরণের", তবে এটি ভুল।
vকোন প্রকারের নয়; এটা interface{}টাইপ হয়

যখন মধ্যে একটি মান ক্ষণস্থায়ী DoSomethingফাংশন, যান আামর নিজের কাছেও সঞ্চালন করা হবে টাইপ রূপান্তর (প্রয়োজন হলে), এবং একটি মান রূপান্তর interface{}মান
সমস্ত মান রানটাইম এ ঠিক এক ধরনের আছে, এবং vএর এক স্ট্যাটিক ধরনের interface{}

একটি ইন্টারফেস মান ডেটা দুটি শব্দের দ্বারা নির্মিত হয় :

  • মানটির অন্তর্নিহিত প্রকারের জন্য একটি পদ্ধতি কোনও টেবিলের দিকে নির্দেশ করতে একটি শব্দ ব্যবহৃত হয়,
  • এবং অন্য শব্দটি সেই মানটির দ্বারা নিখরচায় প্রকৃত ডেটা নির্দেশ করতে ব্যবহৃত হয়।

সংযোজন: এটি ছিল রাশিয়ার নিবন্ধটি একটি ইন্টারফেস কাঠামো সম্পর্কিত সম্পূর্ণ সম্পূর্ণ:

type Stringer interface {
    String() string
}

ইন্টারফেসের মানগুলি দ্বি-শব্দের জোড় হিসাবে প্রতিনিধিত্ব করা হয় যা ইন্টারফেসে সঞ্চিত প্রকারের সম্পর্কিত তথ্য এবং সম্পর্কিত ডেটাতে একটি পয়েন্টার দেয়।
স্ট্রিংজার প্রকারের একটি ইন্টারফেস মানকে বি নির্ধারণ করা ইন্টারফেস মানটির দুটি শব্দই সেট করে।

http://research.swtch.com/gointer2.png

ইন্টারফেস মানটির প্রথম শব্দটি আমি কীটিকে একটি ইন্টারফেস টেবিল বা এটি ব্যবহারযোগ্য বলে ডাকি ( পংক্তিত আই-টেবিল; রানটাইম উত্সগুলিতে, সি বাস্তবায়নের নাম এটিব) points
এর সাথে জড়িত প্রকারগুলি সম্পর্কে কিছু মেটাডেটা শুরু হয় এবং এর পরে এটি ফাংশন পয়েন্টারগুলির তালিকায় পরিণত হয়।
লক্ষ্য করুন যে এটি পরিবর্তনযোগ্য ইন্টারফেস টাইপের সাথে সম্পর্কিত, গতিশীল প্রকারের নয়
আমাদের উদাহরণের বিচারে, Stringerবাইনারি ধরণের ধারণের জন্য এটি স্ট্রিংজারকে সন্তুষ্ট করার জন্য ব্যবহৃত পদ্ধতিগুলি তালিকাভুক্ত করে, যা কেবলমাত্র String: বাইনারি এর অন্যান্য পদ্ধতি ( Get) এর মধ্যে উপস্থিত হয় না itable

ইন্টারফেসের দ্বিতীয় শব্দটি প্রকৃত তথ্যতে পয়েন্ট দেয়, এক্ষেত্রে একটি অনুলিপি b
অ্যাসাইনমেন্টটি একই কারণে বিন্দু না করে var s Stringer = bএকটি অনুলিপি তৈরি করে যা অনুলিপি করে: যদি পরে পরিবর্তন হয়,bbvar c uint64 = bbs এবং cমূল মানটি হয় তবে নতুনটি নয় বলে মনে করা হয়।
ইন্টারফেসে সঞ্চিত মানগুলি নির্বিচারে বড় হতে পারে তবে কেবলমাত্র একটি শব্দ ইন্টারফেস কাঠামোর মান ধরে রাখার জন্য উত্সর্গীকৃত, সুতরাং অ্যাসাইনমেন্টটি গাদাতে মেমরির একটি অংশ বরাদ্দ করে এবং এক-শব্দ স্লটে পয়েন্টারটি রেকর্ড করে।


4
"তথ্য দুটি শব্দ" দ্বারা আপনি কি বোঝাতে চান? বিশেষত, "শব্দ" এর অর্থ কী?
মিংগু

3
@ মিঙ্গু আমি এই দুটি শব্দ (32-বিট পয়েন্ট) বর্ণনা করার জন্য উত্তরটি শেষ করেছি।
ভনসি

2
@ মিংইউ: ভনসি কম্পিউটার আর্কিটেকচার অর্থে একটি শব্দকে উল্লেখ করছে - বিটের সংকলন যা একটি নির্দিষ্ট আকারের ডেটা সংজ্ঞায়িত করে। শব্দ আকার আপনি ব্যবহার করছেন প্রসেসরের আর্কিটেকচার দ্বারা নিয়ন্ত্রিত হয়।
ড্যান এস্পারজা

1
আপনার উত্তরের জন্য @ ভনককে ধন্যবাদ জানাই ... সত্য কথাটি আমি যখন জিজ্ঞাসা করি তখন ডাউনপোস্ট পেতে আমি ক্লান্ত হয়ে পড়েছি .. মানুষ বেশিরভাগ সময় আমাকে বলে যে আমার ডকগুলি পড়তে হবে ... আমি যদি আপনার পরামর্শটি মনে করি তবে আমি মনে করি এটির জন্য একটি পোস্ট সঠিকভাবে লিখতে হবে ... তবে আমি সত্যিই জিজ্ঞাসা করার অন্য কোনও উপায়ে ভাবতে পারি না। সুতরাং যাইহোক ধন্যবাদ এবং আমার কম ইচ্ছাকে ক্ষমা করুন। আপনি এটি দেখতে একবার আপনাকে স্বাগত জানাই: stackoverflow.com/questions/45577301/… আমি কেন জিজ্ঞাসা করতে চাই না তা স্পষ্ট করে জানাতে।
ভিক্টর

1
@ ভিক সমস্যা নেই, এবং একজন জিজ্ঞাসাবিদ হিসাবে আপনার আগের খারাপ অভিজ্ঞতার জন্য দুঃখিত। এটা ঠিক যে মন্তব্যগুলি প্রশ্নোত্তর এবং উত্তরগুলির জন্য খারাপ ফিট।
ভোনসি

34

interface{}এর অর্থ আপনি নিজের কাস্টম প্রকার সহ যে কোনও ধরণের মান রাখতে পারেন। গোতে সমস্ত ধরণের একটি খালি ইন্টারফেস ( interface{}একটি খালি ইন্টারফেস) সন্তুষ্ট করে।
আপনার উদাহরণে, এমএসজি ক্ষেত্রে কোনও প্রকারের মান থাকতে পারে।

উদাহরণ:

package main

import (
    "fmt"
)

type Body struct {
    Msg interface{}
}

func main() {
    b := Body{}
    b.Msg = "5"
    fmt.Printf("%#v %T \n", b.Msg, b.Msg) // Output: "5" string
    b.Msg = 5

    fmt.Printf("%#v %T", b.Msg, b.Msg) //Output:  5 int
}

খেলার মাঠে যান


12

এটিকে খালি ইন্টারফেস বলা হয় এবং এটি সমস্ত ধরণের দ্বারা প্রয়োগ করা হয় যার অর্থ আপনি কোনও কিছুতে রাখতে পারেনMsg ক্ষেত্রটিতে ।

উদাহরণ:

body := Body{3}
fmt.Printf("%#v\n", body) // -> main.Body{Msg:3}

body = Body{"anything"}
fmt.Printf("%#v\n", body) // -> main.Body{Msg:"anything"}

body = Body{body}
fmt.Printf("%#v\n", body) // -> main.Body{Msg:main.Body{Msg:"anything"}}

এটি এই সত্যটির যৌক্তিক বর্ধন যে কোনও ধরণের ইন্টারফেসের সমস্ত পদ্ধতি থাকা মাত্রই একটি ইন্টারফেস প্রয়োগ করে।


এর অর্থ এটি ব্যবহারকারী সংজ্ঞায়িত কাঠামোর অন্তর্নিহিত হতে পারে ??
ব্যবহারকারী

11

এখানে ইতিমধ্যে ভাল উত্তর আছে। যারা অন্যকে স্বজ্ঞাতভাবে বুঝতে চান তাদের জন্য আমার নিজেরও যুক্ত করুন:


ইন্টারফেস

এখানে একটি পদ্ধতির ইন্টারফেস রয়েছে:

type Runner interface {
    Run()
}

সুতরাং যে Run()পদ্ধতিতে কোনও ধরণের রানার ইন্টারফেসটি সন্তুষ্ট করে:

type Program struct {
    /* fields */
}

func (p Program) Run() {
    /* running */
}

func (p Program) Stop() {
    /* stopping */
}
  • যদিও প্রোগ্রাম টাইপের একটি স্টপ পদ্ধতি রয়েছে তবে এটি রানার ইন্টারফেসকে সন্তুষ্ট করে কারণ এটির জন্য একটি ইন্টারফেসের সমস্ত পদ্ধতি থাকা দরকার।

  • সুতরাং এটির একটি রান পদ্ধতি রয়েছে এবং এটি রানার ইন্টারফেসটিকে সন্তুষ্ট করে।


খালি ইন্টারফেস

কোনও পদ্ধতি ছাড়াই এখানে নামকরণ করা খালি ইন্টারফেস রয়েছে:

type Empty interface {
    /* it has no methods */
}

যে কোনও ধরণের এই ইন্টারফেস সন্তুষ্ট। কারণ, এই ইন্টারফেসটি সন্তুষ্ট করার জন্য কোনও পদ্ধতির প্রয়োজন নেই। উদাহরণ স্বরূপ:

// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty

a = 5
a = 6.5
a = "hello"

কিন্তু, উপরের প্রোগ্রামটির ধরণটি কি এটি সন্তুষ্ট করে? হ্যাঁ:

a = Program{} // ok

ইন্টারফেস {} উপরের খালি ইন্টারফেসের সমান।

var b interface{}

// true: a == b

b = a
b = 9
b = "bye"

আপনি দেখতে পাচ্ছেন, এ সম্পর্কে রহস্যজনক কিছু নেই তবে এটি অপব্যবহার করা খুব সহজ। আপনি যতটা পারেন এ থেকে দূরে থাকুন।


https://play.golang.org/p/A-vwTddWJ7G


type Runner interfaceযান খেলার মাঠ উদাহরণে অব্যবহৃত হয়।
টম জে

9

থেকে Golang উল্লেখ :

একটি ইন্টারফেস টাইপ তার ইন্টারফেস বলে একটি পদ্ধতি সেট নির্দিষ্ট করে। ইন্টারফেস প্রকারের একটি পরিবর্তনশীল কোনও ইন্টারফেসের সুপারসেট এমন একটি পদ্ধতি সেট সহ যে কোনও ধরণের মান সঞ্চয় করতে পারে। এই ধরনের একটি ইন্টারফেস বাস্তবায়ন করতে বলা হয়। ইন্টারফেস প্রকারের একটি অবিচ্ছিন্ন ভেরিয়েবলের মান শূন্য।

একটি প্রকার তার পদ্ধতির কোনও উপসেট সমন্বিত যে কোনও ইন্টারফেস প্রয়োগ করে এবং তাই বিভিন্ন স্বতন্ত্র ইন্টারফেস প্রয়োগ করতে পারে। উদাহরণস্বরূপ, সমস্ত ধরণের খালি ইন্টারফেস প্রয়োগ করে:

ইন্টারফেস{}

গ্র্যাপগুলির ধারণাগুলি হ'ল:

  1. সবকিছুরই একটি প্রকার থাকে । আপনি একটি নতুন ধরনের বর্ণনা করতে পারেন, এর এটি এখন কল টি আসুন এর কথা বলা যাক আমাদের প্রকার T3 পদ্ধতি আছে: A, B, C
  2. কোনও ধরণের জন্য নির্দিষ্ট পদ্ধতির সেটকে " ইন্টারফেস টাইপ " বলা হয় । আসুন এটি আমাদের উদাহরণে কল করুন: T_interface। সমানT_interface = (A, B, C)
  3. আপনি পদ্ধতিগুলির স্বাক্ষরটি নির্ধারণ করে একটি "ইন্টারফেস টাইপ" তৈরি করতে পারেন ।MyInterface = (A, )
  4. যখন আপনি একটি নির্দিষ্ট পরিবর্তনশীল এর টাইপ , "ইন্টারফেস ধরনের", আপনি এটি যা ইন্টারফেস আপনার ইন্টারফেস এর একটি সুপারসেট থাকা শুধুমাত্র ধরনের ধার্য করতে পারেন। তার মানে এই যে সমস্ত পদ্ধতি রয়েছে MyInterfaceসেগুলি ভিতরে অন্তর্ভুক্ত থাকতে হবেT_interface

আপনি অনুমান করতে পারেন যে সমস্ত ধরণের সমস্ত "ইন্টারফেস প্রকার" খালি ইন্টারফেসের সুপারসেট।


1

একটি উদাহরণ যা @ ভনসি দ্বারা দুর্দান্ত উত্তর এবং @ নিকক্রাইগ-উডের মন্তব্যকে প্রসারিত করে। interface{}যে কোনও কিছুতে নির্দেশ করতে পারে এবং এটি ব্যবহারের জন্য আপনার প্রয়োজন castালাই / প্রকারের প্রয়োজন।

package main

import (
    . "fmt"
    "strconv"
)

var c = cat("Fish")
var d = dog("Bone")

func main() {
    var i interface{} = c
    switch i.(type) {
    case cat:
        c.Eat() // Fish
    }

    i = d
    switch i.(type) {
    case dog:
        d.Eat() // Bone
    }

    i = "4.3"
    Printf("%T %v\n", i, i) // string 4.3
    s, _ := i.(string)      // type assertion
    f, _ := strconv.ParseFloat(s, 64)
    n := int(f)             // type conversion
    Printf("%T %v\n", n, n) // int 4
}

type cat string
type dog string
func (c cat) Eat() { Println(c) }
func (d dog) Eat() { Println(d) }

iএকটি মান সহ একটি খালি ইন্টারফেসের একটি পরিবর্তনশীল cat("Fish")। ইন্টারফেস ধরণের মান থেকে একটি পদ্ধতি মান তৈরি করা আইনী। Https://golang.org/ref/spec#Interface_tyype দেখুন

একটি টাইপ সুইচ iইন্টারফেসের প্রকারের নিশ্চিত করে cat("Fish")Https://golang.org/doc/effective_go.html#type_switch দেখুন । iতারপরে পুনরায় নিয়োগ দেওয়া হয় dog("Bone")। একটি টাইপ সুইচ নিশ্চিত করে যে iইন্টারফেসের ধরণটি পরিবর্তিত হয়েছেdog("Bone")

এছাড়াও, আপনি এখানে টাইপ চেক করতে কম্পাইলার অনুরোধ করতে পারেন Tইন্টারফেস প্রয়োগ Iএকটি কাজ প্রয়াস দ্বারা: var _ I = T{}। দেখুন https://golang.org/doc/faq#guarantee_satisfies_interface এবং https://stackoverflow.com/a/60663003/12817546

সব ধরণের খালি ইন্টারফেস প্রয়োগ করে interface{}। দেখুন https://talks.golang.org/2012/goforc.slide#44 এবং https://golang.org/ref/spec#Interface_types । এই উদাহরণে, i"4.3" স্ট্রিং-এ পুনরায় নিয়োগ দেওয়া হয়েছে। iতারপরে একটি নতুন স্ট্রিং ভেরিয়েবলের sসাথে বরাদ্দ করা হয়i.(string) আগে আগে ব্যবহার করে sএকটি ফ্ল্যাট 64 প্রকারে রূপান্তর করা হয় । অবশেষে একটি int টাইপকে 4 এর সমান রূপান্তরিত হয় দেখুন প্রকার রূপান্তর এবং প্রকারের নিবন্ধের মধ্যে পার্থক্য কী?fstrconvfn

গো এর অন্তর্নির্মিত মানচিত্র এবং টুকরোগুলি, এবং পাত্রে নির্মাণ করার জন্য খালি ইন্টারফেস ব্যবহার করার ক্ষমতা (স্পষ্টত আনবক্সিং সহ) এর অর্থ অনেক ক্ষেত্রে কোডটি লিখতে পারা যায় যা জেনেরিকগুলি কীভাবে সক্ষম করবে যদি কম সাবলীলভাবে কার্যকর করে। Https://golang.org/doc/faq# জেনারিক্স দেখুন


একটি ইন্টারফেস সহ ডিকোپل কোড। স্ট্যাকওভারফ্লো . com/a/62297796/12817546 দেখুন । কোনও পদ্ধতিকে "গতিশীল" বলুন। স্ট্যাকওভারফ্লো . com/a/62336440/12817546 দেখুন । একটি গো প্যাকেজ অ্যাক্সেস করুন। স্ট্যাকওভারফ্লো . com/a/62278078/12817546 দেখুন । কোনও ভেরিয়েবলের জন্য কোনও মান নির্ধারণ করুন। স্ট্যাকওভারফ্লো . com/a/62337836/12817546 দেখুন ।
টম জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.