খালি স্লাইস শুরু করার সঠিক উপায়


226

একটি অ-স্থির আকারের সাথে একটি খালি স্লাইস ঘোষণা করার জন্য এটি করা আরও ভাল:

mySlice1 := make([]int, 0)

বা:

mySlice2 := []int{}

শুধু ভাবছেন কোনটি সঠিক উপায়।


2
আপনি বলতে "অ-স্থির আকার", কিন্তু টুকরা করা হয় না একটি নির্দিষ্ট আকার আছে। যদি না আপনি শূন্য ক্ষমতা সহ বোঝাতে চান। দ্রষ্টব্য, আপনার কী ক্ষমতার প্রয়োজন হতে পারে তার ধারণা / অনুমান / ইঙ্গিত থাকলে তিনটি আর্গুমেন্ট সংস্করণ ব্যবহার করা ভাল is উদাহরণস্বরূপ মানচিত্র কীগুলির একটি স্লাইস তৈরি করতে:keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
ডেভ সি

উত্তর:


271

আপনার দেওয়া দুটি বিকল্প শব্দার্থগতভাবে অভিন্ন, তবে ব্যবহারের make([]int, 0)ফলে রানটাইম.মেকস্লাইস (Go 1.14) এ অভ্যন্তরীণ কল আসবে ।

আপনার কাছে এটিকে একটি nilমান সহ রেখে যাওয়ার বিকল্প রয়েছে :

var myslice []int

গোলাং.আরোগ ব্লগে যেমন লেখা আছে :

কোনও শূন্য দৈর্ঘ্যের স্লাইসের সাথে নিল টুকরোটি কার্যত সমান, যদিও এটি কিছুই দেখায় না। এটির দৈর্ঘ্য শূন্য এবং বরাদ্দ সহ এটিকে যুক্ত করা যেতে পারে।

একটি nilফালি তবে হবে json.Marshal()মধ্যে "null"একটি খালি ফালি মধ্যে মার্শাল হবে যেহেতু "[]", @farwayer দ্বারা সরু আউট হিসাবে।

@ আরমান অর্দুখানি দ্বারা নির্দেশিত হিসাবে উপরের বিকল্পগুলির মধ্যে কোনওটিই বরাদ্দের কারণ হবে না।



106
সাবধানতা: প্রারম্ভিক টুকরা জন্য এবং json.Marshal()ফিরে আসবেnullvar myslice []int[]myslice := []int{}
farwayer

10
এছাড়াও সতর্ক থাকুন: reflect.DeepEqualশূন্য টুকরা এবং অ শূন্য টুকরা মধ্যে একটি পার্থক্য তোলে: a := []int{}, var b []int,reflect.DeepEqual(a, b) // returns false
asgaines

1
কেন আপনি মনে করেন এটি বরাদ্দ করবে? ক্যাপ শূন্য তাই কিছুই বরাদ্দ নেই। শূন্য দৈর্ঘ্যের জিনিসগুলির জন্য সমস্ত পয়েন্টার স্মৃতিতে একই অবস্থানকে নির্দেশ করে: play.golang.org/p/MPOKKl_sYvw
আরমান আরদোখানি

1
নিবন্ধন করুন আমি এটি চেষ্টা করে দেখেছি এবং এটিও জানতে পেরেছিলাম যে অভিন্ন সমাবেশের নির্দেশাবলীর উপর আমার অনুমানের সাথে আমি ভুল ছিল। সংশোধন করা হয়েছে!
আনিসাস

65

তারা সমতুল্য। এই কোডটি দেখুন:

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

আউটপুট:

mySlice1 0
mySlice2 0

উভয় স্লাইসের 0ক্ষমতা রয়েছে যা উভয় টুকরোকেই বোঝায়0 দৈর্ঘ্য রয়েছে (ধারণক্ষমতার চেয়ে বড় হতে পারে না) যা বোঝায় যে উভয় টুকরোয়ের কোনও উপাদান নেই। এর অর্থ 2 টি স্লাইস প্রতিটি ক্ষেত্রে একরকম।

অনুরূপ প্রশ্নগুলি দেখুন:

গোলাংয়ে শিল নালি আর খালি টুকরো করার কী লাভ?

ন নিল স্লাইস বনাম নন-নীল টুকরো বনাম খালি টুকরো গো ভাষায়


46

অতিরিক্ত হিসাবে @ANisus ' উত্তর ...

নীচে "এক্স-অ্যাকশন" বইয়ের কিছু তথ্য দেওয়া আছে , যা আমি মনে করি এটি উল্লেখযোগ্য:

nilএবং emptyটুকরা মধ্যে পার্থক্য

যদি আমরা এই জাতীয় স্লাইস সম্পর্কে চিন্তা করি:

[pointer] [length] [capacity]

তারপর:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

নীল টুকরা

আপনি যখন এমন কোনও স্লাইস উপস্থাপন করতে চান যা বিদ্যমান নেই, যেমন সেগুলি কার্যকর যখন যেমন কোনও ফাংশনে কোনও ব্যতিক্রম ঘটে যখন স্লাইস ফেরত দেয়।

// Create a nil slice of integers.
var slice []int

খালি টুকরো

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

// Use make to create an empty slice of integers.
slice := make([]int, 0)

// Use a slice literal to create an empty slice of integers.
slice := []int{}

তথাপি আপনি যদি একটি শূন্য ফালি বা একটি খালি ফালি, বিল্ট-ইন ফাংশান ব্যবহার করছেন কিনা append, lenএবং capকাজ একই।


খেলার মাঠের উদাহরণ যান :

package main

import (
    "fmt"
)

func main() {

    var nil_slice []int
    var empty_slice = []int{}

    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))

}

কপি করে প্রিন্ট:

true 0 0
false 0 0

আমরা makeকী ব্যবহার করে এক ধাপে খালি স্লাইসের ঠিকানা পেতে পারি ?
সিমিন জি

আমরা যদি ফাংশন কটাক্ষপাত করা স্বাক্ষর , makeঠিকানা ফিরতে মনে হচ্ছে না। আমি বিশ্বাস করি আপনি এক ধাপে এটি করতে পারবেন না।
tgogos

13

খালি স্লাইস এবং নীল স্লাইস গোতে আলাদাভাবে শুরু করা হয়:

var nilSlice []int 
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}

fmt.Println(nilSlice == nil)    // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false

তিনটি স্লাইস হিসাবে, লেন এবং ক্যাপ 0 হয়।


make([]int, 0)সেরা কারণ জেটব্রাইন্স গো ল্যান্ড এটি "অপ্রয়োজনীয়" হওয়ার বিষয়ে অভিযোগ করে না যেমন এটি ক্ষেত্রে ঘটে []int{}। এটি ইউনিট পরীক্ষা লেখার ক্ষেত্রে কার্যকর।
আন্দ্রেজ রেহমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.