golang-slices

#Go中的切片 切片是一种类似于数组的数据结构,但其大小可变。 在底层,切片使用数组,并且它们是在数组之上构建的抽象,使它们更加灵活和有用(将数组视为较低级别)。 您将以与在高级语言中使用数组非常相似的方式使用切片。 您可以类似于数组定义一个切片,省略长度: var mySlice []string //字符串切片 您可以使用值初始化切片: var mySlice = []string{"First", "Second", "Third"} //或者 mySlice := []string{"First", "Second", "Third"} 您可以使用make()函数创建一个指定长度的空切片: mySlice := make([]string, 3) //长度为3的空字符串切片 您可以从现有切片创建一个新的切片,并向其附加一个或多个项目: mySlice := []string{"First", "Second", "Third"} newSlice := append(mySlice, "Fourth", "Fifth") 请注意,我们需要将append()的结果赋给一个新切片,否则会出现编译器错误。原始切片不会被修改,我们得到的是一个全新的切片。 您还可以使用copy()函数复制一个切片,使其不与其他切片共享内存,并且是独立的: mySlice := []string{"First", "Second", "Third"} newSlice := make([]string, 3) copy(newSlice, mySlice) 如果要复制到的切片没有足够的空间(比原始切片短),则仅复制第一个项目(直到有空间为止)。 您可以从数组初始化一个切片: myArray := [3]string{"First", "Second", "Third"} mySlice = myArray[:] 多个切片可以使用同一数组作为底层数组: myArray := [3]string{"First", "Second", "Third"} mySlice := myArray[:] mySlice2 := myArray[:] mySlice[0] = "test" fmt....

JavaScript 的 reduce() 函式

JavaScript 中 reduce() 函式的詳細說明 reduce() 是陣列中另一個重要的方法。 reduce() 在陣列的每個項目上執行回呼函式,並允許逐步計算結果。如果指定了 initialValue,那麼在第一次迭代中,accumulator 將等於該值。 a.reduce((accumulator, currentValue, currentIndex, array) => { //... }, initialValue) 範例: [1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => { return accumulator * currentValue }, 1) // 迭代 1:1 * 1 => 回傳 1 // 迭代 2:1 * 2 => 回傳 2 // 迭代 3:2 * 3 => 回傳 6 // 迭代 4:6 * 4 => 回傳 24 // 回傳值為 24

JavaScript數組資料結構

數組是任何編程語言中最基本的資料結構。 數組在大多數(如果不是所有)編程語言中都是內建的。 讓我們來談談數組在大多數低級編程語言(如C語言)中的表示方式:它們表示計算機內存中一組連續的存儲單元。 從一個內存單元開始(如果你想的話,可以將這些單元想象成電子表格中的單元格),我們可以通過使用10個連續的存儲單元來創建一個包含10個插槽的數組。 這使我們能夠進行諸如通過知道第一個插槽(# 0)的內存地址,然後簡單地將 2 添加到該地址來訪問插槽#2之類的操作。 在JavaScript中,我們在更高層次上進行工作,數組的工作方式也不同。我們無法像C或其他低級語言那樣直接訪問內存,因此我們無法進行這種類型的數組數學運算。 低級語言中的數組只能存儲一種特定的數據類型,因此我們可以預先計算出數組將占用多少內存,以便將其安全地存儲在可以容納它的計算機內存中。 在JavaScript中,數組可以存儲任何類型的數據,並且可以混合使用。我們可以有一個數字,然後是一個物件,然後是另一個數組。 使用以下語法初始化數組: const myArray = [] 或者 const myArray = new Array() 這兩者沒有區別,但我更喜歡使用簡寫語法[]。 在JavaScript中,我們不需要在創建時指定數組大小,但是我們可以這樣做: const myArray = new Array(10) 然後我們可以填充數組的值: let val = 1 for (const [i, v] of myArray.entries()) { myArray[i] = val++ } 您可以使用以下語法引用數組中的第一個項目: myArray[0] (索引從0開始),並且可以通過增加索引號獲取數組中的每個後續項目: myArray[4] //5 myArray[3 + 4] //8 您可以使用以下語法更改任何位置的項目值: myArray[3] = 'Another item' JavaScript中的數組在內部是對象,因此它們具有方法。您可以使用 push方法將一個項目添加到數組的末尾: myArray.push(11) 您可以使用splice()方法(不要與slice()混淆)在任何位置添加項目。 在開頭: myArray.splice(0, 0, 'new item') 在索引3處: myArray.splice(3, 0, 'new item') 您可以使用以下語法從數組的末尾刪除一個項目:...

JavaScript演算法:氣泡排序

氣泡排序是一種簡單的排序演算法,但它的效率相對較低,最壞的情況下的時間複雜度為 O(n^2)。 儘管如此,學習它是值得的。 我們遍歷一個數組,將每個元素與其旁邊的元素進行比較。 如果右邊的元素比較小,我們就交換它們的位置。 以下是我們的實現: const bubbleSort = (originalArray) => { let swapped = false const a = [...originalArray] for (let i = 1; i < a.length - 1; i++) { swapped = false for (let j = 0; j < a.length - i; j++) { if (a[j + 1] < a[j]) { ;[a[j], a[j + 1]] = [a[j + 1], a[j]] swapped = true } } if (!swapped) { return a } } return a } 你可以看到,O(n^2) 是因為我們對數組進行了兩次循環,以檢查是否需要將項目與右邊的項目交換位置。...

Swift:如何從數組中獲取隨機項目

本教程屬於 Swift 系列 假設您有一個 Swift 數組,像這樣: let items = [1, 2, 3] 且您想從中獲取一個隨機數字。 數組數據類型提供了 randomElement() 函數,該函數返回一個 Element? : let item = items.randomElement()

使用Rest和Spread處理物件和陣列

學習在JavaScript中使用兩種現代技術來處理陣列和物件。 你可以使用spread運算子 ...來展開陣列、物件或字串。 讓我們從一個陣列的例子開始。給定 const a = [1, 2, 3] 你可以使用以下方式創建一個新的陣列 const b = [...a, 4, 5, 6] 你也可以使用以下方式創建一個陣列的複製 const c = [...a] 這對於物件也同樣適用。使用以下方式克隆一個物件: const newObj = { ...oldObj } 對於字串,spread運算子會創建一個包含字串中每個字符的陣列: const hey = 'hey' const arrayized = [...hey] // ['h', 'e', 'y'] 這個運算子有一些非常有用的應用。其中最重要的一個是在非常簡單的方式下將陣列用作函數參數: const f = (arg1, arg2) => {} const a = [1, 2] f(...a) (在過去,你可以使用 f.apply(null, a) 來實現這一點,但這不太好看和易讀) rest元素在處理陣列解構時非常有用: const numbers = [1, 2, 3, 4, 5] [first, second, ....

如何在 JavaScript 陣列中獲取項目的索引

下面是根據值在 JS 陣列中檢索項目索引的方法。 假設您有一個包含在陣列中的項目的值,並且您想獲取其索引。 您該如何做到這一點? 如果項目是原始值,例如字符串或數字,您可以使用陣列的 indexOf 方法: const letters = ['a', 'b', 'c'] const index = letters.indexOf('b') //index 是 `1` 請記住,索引從數字 0 開始。 如果項目是物件,您無法使用這種方式,因為如果您嘗試這樣做: const letters = [ { letter: 'a', }, { letter: 'b', }, { letter: 'c', }, ] const index = letters.indexOf({ letter: 'b', }) index 將是 -1,這意味著未找到該項目。因為物件是按參考進行比較的,而不是按值進行比較(與原始類型不同)。傳遞給 indexOf 的物件是一個完全不同的物件,而不是陣列中的第二個項目。 您可以像這樣使用 findIndex 方法,它會遍歷陣列中的每個項目,並將元素和索引傳遞給運行的函式。從該函式返回的值將賦值給 findIndex 的返回值: const letters = [ { letter: 'a', }, { letter: 'b', }, { letter: 'c', }, ] const index = letters....

如何在Bash中循環遍歷數組

了解如何在Bash中循環遍歷數組 我有一個包含3個字符串的數組: list=( "first" "second" "third" ) 我想在Bash Shell腳本中對它們進行循環遍歷。 下面是我的實現方式: for i in "${list[@]}" do : echo $i done

如何在JavaScript中按照屬性值對對象數組進行排序

讓我們來看看如何在JavaScript中按照屬性值對對象數組進行排序吧! 假設你有一個對象數組。 你可能面臨這樣的問題:如何按照某個屬性的值對該數組進行排序? 假設你有如下的對象數組: const list = [ { color: 'white', size: 'XXL' }, { color: 'red', size: 'XL' }, { color: 'black', size: 'M' } ] 你想要渲染這個列表,但首先你想要按照其中一個屬性的值對其進行排序。比如按照顏色名稱的字母順序排序:black, red, white。 你可以使用Array的sort()方法,該方法接受一個回調函數作為參數,該回調函數接受數組中的兩個對象(我們稱之為 a 和 b)作為參數: list.sort((a, b) => (a.color > b.color) ? 1 : -1) 當我們返回1時,該函數告訴sort()函數在排序中應該優先選擇對象b而不是對象a。返回-1則相反。 回調函數還可以計算其他屬性,以處理顏色相同的情況,同時根據第二個屬性進行排序: list.sort((a, b) => (a.color > b.color) ? 1 : (a.color === b.color) ? ((a.size > b.size) ? 1 : -1) : -1)

如何在JavaScript中獲取兩個日期之間的天數

給定兩個JavaScript的Date對象,我該如何獲取這兩個日期之間的日期(也表示為Date對象)列表? 我曾經遇到這個問題:給定兩個JavaScript的Date對象,我該如何獲取這兩個日期之間的日期(也表示為Date對象)列表? 這裡有一個用於計算日期的函數: 它以兩個日期對象作為參數,並返回一個日期對象的數組: const getDatesBetweenDates = (startDate, endDate) => { let dates = [] // 為了避免修改原始日期 const theDate = new Date(startDate) while (theDate < endDate) { dates = [...dates, new Date(theDate)] theDate.setDate(theDate.getDate() + 1) } return dates } 使用示例: const today = new Date() const threedaysFromNow = new Date(today) threedaysFromNow.setDate(threedaysFromNow.getDate() + 3) getDatesBetweenDates(today, threedaysFromNow) 如果你還想包括起始日期和結束日期,可以使用下面這個版本,在最後添加它們: const getDatesBetweenDates = (startDate, endDate) => { let dates = [] // 為了避免修改原始日期 const theDate = new Date(startDate) while (theDate < endDate) { dates = [....