নেস্টেড স্ট্রাক্ট শুরু করুন


123

নেস্টেড স্ট্রাক্টটি কীভাবে আরম্ভ করতে হবে তা আমি বুঝতে পারি না। এখানে একটি উদাহরণ খুঁজুন: http://play.golang.org/p/NL6VXdHrjh

package main

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: {
            Address: "addr",
            Port:    "80",
        },
    }

}

1
শুধু শিখতে গিয়ে ঠিক একই প্রশ্ন ছিল। আপনি অ্যারে এবং মানচিত্রের জন্য উপাদান ধরণের বাদ দিতে পারেন তবে নেস্টেড স্ট্রাইকগুলির জন্য নয়। অলৌকিক এবং অসুবিধেয়। কেউ ব্যাখ্যা করতে পারেন কেন?
— পিটার ডটচেভ

উত্তর:


177

ঠিক আছে, প্রক্সিটিকে নিজস্ব স্ট্রাক্ট না করার কোনও নির্দিষ্ট কারণ?

যাইহোক আপনার কাছে 2 টি বিকল্প রয়েছে:

সঠিক উপায়, কেবল প্রক্সিটিকে তার নিজস্ব স্ট্রাক্টে সরান, উদাহরণস্বরূপ:

type Configuration struct {
    Val string
    Proxy Proxy
}

type Proxy struct {
    Address string
    Port    string
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: Proxy{
            Address: "addr",
            Port:    "port",
        },
    }
    fmt.Println(c)
    fmt.Println(c.Proxy.Address)
}

কম সঠিক এবং কুরুচিপূর্ণ উপায় কিন্তু এখনও কাজ করে:

c := &Configuration{
    Val: "test",
    Proxy: struct {
        Address string
        Port    string
    }{
        Address: "addr",
        Port:    "80",
    },
}

1
দ্বিতীয় পদ্ধতিতে আমরা পুনরাবৃত্তিমূলক কাঠামো সংজ্ঞা এড়াতে পারি?
— গৌরব ওঝা

@GauravOjha না সব পথ, কিন্তু কিছু মত play.golang.org/p/n24BD3NlIR
— OneOfOne

আমি মনে করি যে একটি এম্বেডযুক্ত প্রকারটি ব্যবহারের জন্য সম্পর্কের ক্ষেত্রে আরও উপযুক্ত।
— ক্র্যাকারপ্লেস

@ এসপিহর দ্বারা নীচে নির্দেশিত হিসাবে আপনি ডট স্বরলিপি ব্যবহার করে সরাসরি ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন।
— স্নাসার

প্রক্সির কাঠামোর মতো ক্ষেত্র থাকলে কী হবে? অন্য নেস্টেড স্ট্রাক্টের মধ্যে কীভাবে এগুলি প্রাথমিককরণ করবেন?
— কুচিংহিতাম

89

যদি আপনি নেস্টেড স্ট্রাক্টের জন্য পৃথক স্ট্রাক্ট সংজ্ঞা নিয়ে যেতে না চান এবং @OneOfOne দ্বারা প্রস্তাবিত দ্বিতীয় পদ্ধতিটি আপনি পছন্দ করেন না তবে আপনি এই তৃতীয় পদ্ধতিটি ব্যবহার করতে পারেন:

package main
import "fmt"
type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {
    c := &Configuration{
        Val: "test",
    }

    c.Proxy.Address = `127.0.0.1`
    c.Proxy.Port = `8080`
}

আপনি এটি এখানে পরীক্ষা করতে পারেন: https://play.golang.org/p/WOSYCxzCF2


8
বাহ, নেস্টেড স্ট্রাক্টগুলি কীভাবে আরম্ভ করতে হবে এই প্রশ্নের একটি সত্য উত্তর ।
— সর্বোচ্চ

1
এটি আসলে বেশ ভাল, তবে আমরা যদি এক লাইনে এটি করতে পারতাম তবে আরও ভাল হত!
— গৌরব ওঝা

1
আমি এমন একটি উপায় সন্ধান করছিলাম যেখানে আপনাকে কী করতে হবে না ? কাজ করার c.Proxy.Address = `127.0.0.1` c.Proxy.Port = `8080` সময় সেই মানগুলি আরম্ভ করার কোনও উপায় আছে কি &Configuration{}?
— ম্যাথিউস ফিলিপ

1
কিন্তু তারপর আপনি সংজ্ঞায়িত করতে হবে @MatheusFelipe আপনি পারেন Proxyতার নিজস্ব struct হিসাবে, @OneOfOne দ্বারা উত্তর প্রথম পদ্ধতি দেখতে
— sepehr

আইএমও, এটি গৃহীত উত্তরের চেয়ে ভাল।
— ডোমারিগেটো

14

আপনার Proxyস্ট্রাক্ট পৃথকভাবে সংজ্ঞায়িত করুন , এর বাইরেও Configuration:

type Proxy struct {
    Address string
    Port    string
}

type Configuration struct {
    Val string
    P   Proxy
}

c := &Configuration{
    Val: "test",
    P: Proxy{
        Address: "addr",
        Port:    "80",
    },
}

Http://play.golang.org/p/7PELCVsQIc দেখুন


যদি P Proxyএকটি অ্যারে হয়?
— এরতুউরুল আল্টনবোয়া

10

আপনার এই বিকল্পটিও রয়েছে:

type Configuration struct {
        Val string
        Proxy
}

type Proxy struct {
        Address string
        Port    string
}

func main() {
        c := &Configuration{"test", Proxy{"addr", "port"}}
        fmt.Println(c)
}

হ্যাঁ বা দ্বিতীয় প্রারম্ভিক ক্ষেত্রের
— পিয়েরিক এইচএমবার্ট

যদি Proxyএকটি অ্যারে হয়?
— এরতুউরুল আল্টনবোয়া

9

আপনি যখন কোনও বাহ্যিক প্যাকেজে সংজ্ঞায়িত কোনও সর্বজনীন প্রকারটি ইনস্ট্যান্ট করতে চান তখন একটি গোছা উঠে আসে এবং সেই ধরণেরটি ব্যক্তিগতভাবে অন্যান্য ধরণের এম্বেড করে।

উদাহরণ:

package animals

type otherProps{
  Name string
  Width int
}

type Duck{
  Weight int
  otherProps
}

আপনি কীভাবে Duckনিজের প্রোগ্রামে ইনস্ট্যান্ট করবেন ? আমি এখানে সেরা আসতে পারি:

package main

import "github.com/someone/animals"

func main(){
  var duck animals.Duck
  // Can't instantiate a duck with something.Duck{Weight: 2, Name: "Henry"} because `Name` is part of the private type `otherProps`
  duck.Weight = 2
  duck.Width = 30
  duck.Name = "Henry"
}

যারা আমার মতো ভুলে গেছেন তাদের জন্য, আপনার কাঠামোর বৈশিষ্ট্যগুলি মূলধন অক্ষরের সাথে নাম রাখুন অন্যথায়, আপনি cannot refer to unexported field or method ত্রুটির মুখোমুখি হবেন ।
— ই

5

আপনি newহাত দ্বারা সমস্ত ক্ষেত্র ব্যবহার করে বরাদ্দ এবং প্রাথমিককরণ করতে পারেন

package main

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {
    c := new(Configuration)
    c.Val = "test"
    c.Proxy.Address = "addr"
    c.Proxy.Port = "80"
}

খেলার মাঠে দেখুন: https://play.golang.org/p/sFH_- হাও_এম


2

আপনি কোনও কাঠামো সংজ্ঞায়িত করতে পারেন এবং এর উপাদানটি অন্য কাঠামোর মতো তৈরি করতে পারেন যেমন আমি নীচে করেছি:

package main

import "fmt"

type Address struct {
    streetNumber int
    streetName   string
    zipCode      int
}

type Person struct {
    name    string
    age     int
    address Address
}

func main() {
    var p Person
    p.name = "Vipin"
    p.age = 30
    p.address = Address{
        streetName:   "Krishna Pura",
        streetNumber: 14,
        zipCode:      475110,
    }
    fmt.Println("Name: ", p.name)
    fmt.Println("Age: ", p.age)
    fmt.Println("StreetName: ", p.address.streetName)
    fmt.Println("StreeNumber: ", p.address.streetNumber)
}

আশা করি এটি আপনাকে সহায়তা করেছে :)


2

সময়কালে আপনাকে নামবিহীন কাঠামোটির নতুন সংজ্ঞা দিতে হবে &Configuration{}

package main

import "fmt"

type Configuration struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func main() {

    c := &Configuration{
        Val: "test",
        Proxy: struct {
            Address string
            Port    string
        }{
            Address: "127.0.0.1",
            Port:    "8080",
        },
    }
    fmt.Println(c)
}

https://play.golang.org/p/Fv5QYylFGAY

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