স্লাইস ঘোষণা করুন বা স্লাইস তৈরি করবেন?


102

গোতে, var s []intএবং এর মধ্যে পার্থক্য কী s := make([]int, 0)?

আমি দেখতে পাচ্ছি যে দুটোই কাজ করে তবে কোনটি ভালো?


প্রথমটি একটি nilস্লাইস তৈরি করে , অন্যটি একটি স্লাইস তৈরি করে empty(এটি "অ্যাকশন বইতে যান" দ্বারা ব্যবহৃত পরিভাষা )। এখানে খুব একই উত্তর পোস্ট এড়াতে, আপনি না পরীক্ষা করতে stackoverflow.com/a/45997533/1561148
tgogos

উত্তর:


96

ছাড়াও fabriziom এর উত্তর , আপনি "এ আরো উদাহরণ দেখতে পারেন : ব্যবহার এবং অভ্যন্তরীণ যান স্লাইস , যেখানে একটি ব্যবহার" []intউল্লেখ করা হয়:

যেহেতু একটি স্লাইসের শূন্য মান ( nil) একটি শূন্য দৈর্ঘ্যের স্লাইসের মতো কাজ করে , আপনি একটি স্লাইস ভেরিয়েবল ঘোষণা করতে পারেন এবং তারপরে এটি একটি লুপে যুক্ত করতে পারেন:

// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
    var p []int // == nil
    for _, v := range s {
        if fn(v) {
            p = append(p, v)
        }
    }
    return p
}

এর মানে, একটি ফালি লিখবেন করতে, আপনাকে প্রথমে মেমরি বরাদ্দ করা হবে না: nilছে p int[]যেমন একটি ফালি যোগ করতে যথেষ্ট।


কেন আপনি মনে করেন এটি বরাদ্দ করবে? ক্যাপ শূন্য তাই কোনও মেক বা ছাড়াই বরাদ্দ নেই।
আরমান আরদোখানি

4
টুইটারে আমি ঘোষণাপত্রটি var p []intব্যবহারের চেয়ে আরও সহজ make(যা আমি বরাদ্দের সাথে আরও বেশি সংযুক্ত করি, যদিও 0 ক্যাপযুক্ত হলেও এটি কোনও বরাদ্দ দেয় না)। পাঠযোগ্যতার মেয়াদে, আমি makeএখানে ব্যবহার না করা পছন্দ করি ।
ভোনসি

4
আমি সর্বত্র আক্ষরিক ব্যবহারের দিকে বেশি (যেমন p := []int{})। যেহেতু আমরা সাধারণত :=বেশিরভাগ ভেরিয়েবল ঘোষণার জন্য বাক্য গঠন ব্যবহার করি , তাই স্লাইসের ব্যতিক্রম না হয়ে সর্বত্র এটি থাকা আরও স্বাভাবিক more এগুলি বরাদ্দের কথা চিন্তা করার চেষ্টা করা ব্যতীত সাধারণত মানুষকে অকাল অনুকূলকরণের দিকে ঠেলে দেয়।
আরমান আরদোখানি

116

সরল ঘোষণা

var s []int

মেমরি এবং বরাদ্দ নেই sপয়েন্ট nil, যখন

s := make([]int, 0)

s0 টি উপাদান সহ একটি স্লাইসে মেমরি এবং পয়েন্টগুলিকে বরাদ্দ করে।

সাধারণত, আপনি যদি আপনার ব্যবহারের ক্ষেত্রে সঠিক আকার না জানেন তবে প্রথমটিটি আরও মূর্খ।


আমি কি মানচিত্রের জন্য একই বলতে পারি? var মি ম্যাপ [স্ট্রিং] ইন্ট বনাম এম: = মেক (ম্যাপ [স্ট্রিং] ইন্ট)? ধন্যবাদ
জোশুয়া

11
নাহ, আপনাকে makeমানচিত্রের প্রয়োজন কারণ mapকিছু খালি রাখার জন্য খালি স্থানও বরাদ্দ রয়েছে।
twotwotwo

11
আপনার যদি 0 টি উপাদান ('শূন্যের পরিবর্তে') দিয়ে একটি ফালি ফিরতে চান তবে সঠিকভাবে তৈরি করা উচিত।
জেস

6
আপনি যদি কোনও এআইপি তৈরি করছেন এবং প্রতিক্রিয়া হিসাবে একটি অ্যারের ফিরিয়ে দেন, ঘোষিত ফর্মটি ব্যবহার করে nilখালি অ্যারের পরিবর্তে আপনার স্লাইজের কোনও উপাদান না থাকলে ফিরে আসবে । তবে, যদি makeস্লাইস তৈরি করতে ব্যবহৃত হয়, পরিবর্তে একটি খালি অ্যারে ফিরে আসবে, যা সাধারণত কাঙ্ক্ষিত প্রভাব।
রবিনমিত্র

6
এই উত্তরের একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে: স্ট্যাকওভারফ্লো.com/ a/ 29164565 / 1311538 , জসন মার্শালিংয়ের মতো কাজ করার চেষ্টা করার সময় পার্থক্য রয়েছে। শূন্য ফালি (Marshaling var s []int) উত্পাদন করা হবে null, যখন খালি ফালি (marshaling s := make([]int, 0)) প্রত্যাশিত উত্পাদন করা হবে[]
asgaines

8

সবেমাত্র একটি পার্থক্য খুঁজে পেয়েছি। আপনি যদি ব্যবহার

var list []MyObjects

এবং তারপরে আপনি আউটপুটটিকে JSON হিসাবে এনকোড করে পাবেন null

list := make([]MyObjects, 0)

[]প্রত্যাশিত হিসাবে ফলাফল ।


হ্যাঁ, উত্তরোত্তরটি বেশ কার্যকর যখন আমরা নাল পরিবর্তে [] অ্যারে দিয়ে প্রতিক্রিয়া জানাতে চাই
Nhan Tran

4

আরও কিছু সম্পূর্ণ সম্পূর্ণ (আরও একটি যুক্তিতে make) উদাহরণ:

slice := make([]int, 2, 5)
fmt.Printf("length:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

আউট:

length:  2 - capacity 5 - content:  [0 0]

বা ডায়নামিক ধরণের সহ slice:

slice := make([]interface{}, 2, 5)
fmt.Printf("length:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

আউট:

length:  2 - capacity 5 - content:  [<nil> <nil>]

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