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


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.