মডিউল পাঠ (2/5)
স্লাইস: ইডিওম্যাটিক গঠন
একটি স্লাইস হল Go-তে সবচেয়ে বেশি ব্যবহৃত ডেটা স্ট্রাকচার: একটি ডাইনামিক ভিউ
একটি অন্তর্নিহিত অ্যারের উপর। সিনট্যাক্স: []T। অ্যারে থেকে ভিন্ন, দৈর্ঘ্য হল
টাইপের অংশ নয়, এবং আপনি append এর সাথে এটি বাড়াতে পারেন।
একটি টুকরা শারীরস্থান
অভ্যন্তরীণভাবে একটি স্লাইস একটি তিন-ক্ষেত্রের কাঠামো:
- অন্তর্নিহিত অ্যারের প্রথম উপাদানটির জন্য একটি পয়েন্টার
- একটি দৈর্ঘ্য (
len): দৃশ্যমান উপাদানের সংখ্যা - একটি ক্ষমতা (
cap): দৃশ্যের শুরু থেকে উপলব্ধ উপাদান অন্তর্নিহিত অ্যারের শেষ পর্যন্ত
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3সৃষ্টি
a := []int{1, 2, 3} // literal
b := make([]int, 3) // [0 0 0] len=3 cap=3
c := make([]int, 3, 10) // len=3 cap=10 (reserved)
var d []int // nil slice: len=0 cap=0, still usable with appendappend: সর্বদা ফলাফল বরাদ্দ করুন
append উপাদান যোগ করে এবং একটি নতুন স্লাইস প্রদান করে (সম্ভাব্যভাবে
ক্ষমতা অপর্যাপ্ত হলে একটি নতুন অ্যারে বরাদ্দ করা হচ্ছে):
s := []int{1, 2, 3}
s = append(s, 4) // [1 2 3 4]
s = append(s, 5, 6, 7) // append multiple elements
s = append(s, altra...) // concatenate another slice (spread)স্লাইস এক্সপ্রেশন s[a:b]
a (অন্তর্ভুক্ত) থেকে b (এক্সক্লুসিভ) থেকে একটি সাব-স্লাইস বের করে:
s := []int{10, 20, 30, 40, 50}
sub := s[1:4] // [20 30 40]
inizio := s[:2] // [10 20]
fine := s[3:] // [40 50]
intera := s[:] // [10 20 30 40 50]সাব-স্লাইস অন্তর্নিহিত অ্যারে ভাগ করে মূল স্লাইসের সাথে:
sub[i] = ... এর মাধ্যমে মিউটেশনগুলি s এও দৃশ্যমান।
পিটফল: অ্যারে শেয়ারিং
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!একটি স্বাধীন অনুলিপি পেতে, copy বা append ব্যবহার করুন:
out := make([]int, len(sub))
copy(out, sub)চেষ্টা করে দেখুন
[1, 2, 3] দিয়ে একটি স্লাইস s তৈরি করুন এবং 4 যোগ করতে append ব্যবহার করুন।
ইঙ্গিত দেখান
সর্বদা `s`-এ আবার যুক্ত করার ফলাফল বরাদ্দ করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
সূচক 1 থেকে 3 এক্সক্লুসিভ (যেমন [20, 30]) সহ উপাদানগুলি বের করতে একটি স্লাইস এক্সপ্রেশন ব্যবহার করুন।
ইঙ্গিত দেখান
সিনট্যাক্স: `s[start:end]`, `start` inclusive, `end` exclusive.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
এর মধ্যে কোনটি লিখতে ভুল?
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)রিক্যাপ
[]T: একটি অ্যারের উপর গতিশীল দৃশ্য; ট্রিপল (ptr, লেন, ক্যাপ)।make([]T, len, cap)আগে থেকে বরাদ্দ করতে; একটি ব্যবহারযোগ্য শূন্য স্লাইসের জন্যvar s []T।s = append(s, ...): সর্বদা ফলাফল বরাদ্দ করুন।s[a:b]অন্তর্নিহিত অ্যারে ভাগ করে:copy(...)স্বাধীন কপিগুলির জন্য৷- একটি
nilস্লাইস = পড়তে/পরিসীমা/সংযোজন করতে ঠিক আছে; একটি শূন্য মানচিত্র থেকে বেশ ভিন্ন.