最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言之?dāng)?shù)組和切片使用及說明

 更新時間:2025年09月18日 09:09:20   作者:可能只會寫B(tài)UG  
Go語言中數(shù)組是固定大小的值類型,切片是動態(tài)引用類型,包含指針、長度和容量,切片支持追加、刪除等操作,但不能直接比較,數(shù)組長度固定,切片可靈活擴(kuò)容,常用于動態(tài)數(shù)據(jù)場景

Array(數(shù)組)

在 Go 語言中,數(shù)組是一種固定大小的數(shù)據(jù)結(jié)構(gòu),用于存儲同類型的元素。數(shù)組的大小在編譯時確定,定義后不能更改。

數(shù)組的注意事項:

數(shù)組是值類型,當(dāng)將數(shù)組傳遞給函數(shù)時,實際上是傳遞了數(shù)組的副本。如果希望函數(shù)能夠修改原數(shù)組,可以使用指向數(shù)組的指針。

  • 數(shù)組的長度是數(shù)組類型的一部分,因此 [5]int 和 [10]int 是不同類型。
  • 數(shù)組在 Go 語言中是一個基本的數(shù)據(jù)結(jié)構(gòu),用于存儲固定大小的同一類型元素。
  • 雖然 Go 提供了數(shù)組的支持,但在實際開發(fā)中,切片(slice)通常更受歡迎,
  • 因為它們更靈活(可以動態(tài)調(diào)整大?。子谑褂?。數(shù)組主要用于需要固定大小的場景。

數(shù)組支持 “==“、”!=” 操作符,因為內(nèi)存總是被初始化過的。

[n]*T表示指針數(shù)組,[n]T表示數(shù)組指針

定義數(shù)組

數(shù)組的定義語法如下:

var arrayName [size]dataType
arrayName 是數(shù)組的名稱。
size 是數(shù)組的長度(固定的)。
dataType 是數(shù)組中元素的數(shù)據(jù)類型。
聲明和初始化數(shù)組
package main

import "fmt"

func main() {
    // 聲明一個長度為 5 的整數(shù)數(shù)組
    var numbers [5]int

    // 初始化數(shù)組
    numbers[0] = 1
    numbers[1] = 2
    numbers[2] = 3
    numbers[3] = 4
    numbers[4] = 5

    fmt.Println("數(shù)組內(nèi)容:", numbers)
}
聲明并初始化數(shù)組
可以在聲明數(shù)組時直接初始化它:

package main

import "fmt"

func main() {
    // 聲明并初始化
    colors := [3]string{"紅", "綠", "藍(lán)"}

    fmt.Println("顏色數(shù)組:", colors)
}
使用簡短聲明
用簡短聲明也可以創(chuàng)建數(shù)組:

package main

import "fmt"

func main() {
    fruits := [...]string{"蘋果", "香蕉", "橙子"} // 根據(jù)初始化的元素數(shù)量來確定數(shù)組長度

    fmt.Println("水果數(shù)組:", fruits) // 輸出: 水果數(shù)組: [蘋果 香蕉 橙子]
    fmt.Println("長度:", len(fruits)) // 輸出: 3
}
數(shù)組的訪問
可以通過索引訪問數(shù)組的元素,索引從 0 開始:

package main

import "fmt"

func main() {
    days := [7]string{"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"}

    for i := 0; i < len(days); i++ {
        fmt.Printf("索引: %d, 值: %s\n", i, days[i])
    }
	// 方法2:for range遍歷
	for i, day := range days {
		fmt.Printf("索引: %d, 值: %s\n", i, day)
	}

}

數(shù)組的長度

使用內(nèi)置的 len() 函數(shù)可以獲取數(shù)組的長度:

package main

import "fmt"

func main() {
numbers := [5]int{10, 20, 30, 40, 50}
fmt.Println("數(shù)組長度:", len(numbers))
}

我們還可以使用指定索引值的方式來初始化數(shù)組

func main() {
	a := [...]int{1: 1, 3: 5}
	fmt.Println(a)                  // [0 1 0 5]
	fmt.Printf("type of a:%T\n", a) //type of a:[4]int
}

多維數(shù)組

Go 語言支持多維數(shù)組,常用的如二維數(shù)組。二維數(shù)組可以被看作是數(shù)組的數(shù)組:

package main

import "fmt"

func main() {
    // 聲明一個 3x3 的整數(shù)二維數(shù)組
    matrix := [3][3]int{
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    }

    // 遍歷二維數(shù)組
    for i := 0; i < len(matrix); i++ {
        for j := 0; j < len(matrix[i]); j++ {
            fmt.Print(matrix[i][j], " ")
        }
        fmt.Println()
    }
}

切片(slice)

切片(Slice)是 Go 語言中一個非常重要且常用的數(shù)據(jù)類型,它是對數(shù)組的一個輕量級抽象。

切片可以動態(tài)地調(diào)整大小,靈活性更高,操作也更加簡便。切片本質(zhì)上是對底層數(shù)組的一個引用。

切片的基本概念

切片由三部分組成:

  • 指針:指向切片的第一個元素的地址(指向底層數(shù)組的某個位置)。
  • 長度:切片中元素的數(shù)量。
  • 容量:切片從其第一個元素開始到底層數(shù)組的長度。
切片的底層結(jié)構(gòu)定義在 runtime 包中,具體結(jié)構(gòu)如下
type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
array: 指向底層數(shù)組的指針。

len: 切片當(dāng)前的長度(元素個數(shù))。

cap: 切片的容量(底層數(shù)組的總大?。?。

切片的定義

var 變量名 []切片中元素類型

package main

import "fmt"

func main() {
	// 聲明切片類型
	var a0 []string //聲明一個字符串切片 此時沒有初始化,是nil

	var a = []string{}          //聲明一個字符串切片 并初始化為空切片
	var b = []int{}             //聲明一個整型切片并初始化
	var c = []bool{false, true} //聲明一個布爾切片并初始化
	//var d = []bool{false, true} //聲明一個布爾切片并初始化
	
	if a0 == nil {
		fmt.Println("a0 is nil")
	}
	if a == nil {
		fmt.Println("a is nil")
	}

	fmt.Println(a)        //[]
	fmt.Println(b)        //[]
	fmt.Println(c)        //[false true]
	fmt.Println(a == nil) //true
	fmt.Println(b == nil) //false
	fmt.Println(c == nil) //false
	//fmt.Println(c == d)   //切片是引用類型,不支持直接比較,只能和nil比較
}

從數(shù)組創(chuàng)建切片

package main

import "fmt"

func main() {
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // 創(chuàng)建從索引1到索引3的切片
        
fmt.Println("切片:", slice) // 輸出: [2 3 4]
}


func main() {
	a := [5]int{1, 2, 3, 4, 5}
	t := a[1:3:3] //意思是從索引1開始,到索引3結(jié)束不包括3,但容量為2

	t := a[1:3:5] //意思是從索引1開始,到索引3結(jié)束不包括3,但容量為4 容量是從切片的起始索引1到原數(shù)組的最大索引(在這里是5)之間的元素數(shù)量,包括a[4]。所以從索引1到4的元素有效。
	fmt.Printf("t:%v len(t):%v cap(t):%v\n", t, len(t), cap(t))
}

從數(shù)組創(chuàng)建切片注意

切片的底層就是一個數(shù)組,所以我們可以基于數(shù)組通過切片表達(dá)式得到切片。

切片表達(dá)式中的low 和high 表示一個索引范圍(左包含,右不包含),

對切片再執(zhí)行切片表達(dá)式時(切片再切片),high的上限邊界是切片的容量cap(a), 而不是長度。

常量索引必須是非負(fù)的,并且可以用int類型的值表示;

對于數(shù)組或常量字符串,常量索引也必須在有效范圍內(nèi)。

如果low和high兩個指標(biāo)都是常數(shù),它們必須滿足low <= high。

如果索引在運(yùn)行時超出范圍,就會發(fā)生運(yùn)行時panic

  • //切片是對底層數(shù)組的一個視圖,并不會復(fù)制整個數(shù)組。當(dāng)你從一個數(shù)組創(chuàng)建切片時,
  • //切片只是創(chuàng)建了一個指向原始數(shù)組的引用,因此切片對原始數(shù)組的修改會影響到原始數(shù)組,反之亦然。
func main() {
	a := [5]int{1, 2, 3, 4, 5} //定義一個數(shù)組
	s := a[1:3]                // s := a[low:high]
	//s:[2 3] len(s):2 cap(s):4
	fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))

	//切片是對底層數(shù)組的一個視圖,并不會復(fù)制整個數(shù)組。當(dāng)你從一個數(shù)組創(chuàng)建切片時,
	//切片只是創(chuàng)建了一個指向原始數(shù)組的引用,因此切片對原始數(shù)組的修改會影響到原始數(shù)組,反之亦然。

	s2 := s[3:4] // 索引的上限是cap(s)而不是len(s)
	//s2:[5] len(s2):1 cap(s2):1
	fmt.Printf("s2:%v len(s2):%v cap(s2):%v\n", s2, len(s2), cap(s2))

	a[1] = 10
	fmt.Printf("a:%v len(a):%v cap(a):%v\n", a, len(a), cap(a))
	fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))

}

如何不受限地通過數(shù)組創(chuàng)建切片

1. 使用 copy 函數(shù)(推薦)
copy 函數(shù)可以用來復(fù)制一個切片的內(nèi)容到另一個切片。這樣你就能得到一個不受原切片影響的新切片。
package main

import "fmt"

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    s := a[1:3] // 創(chuàng)建切片 s,內(nèi)容為 [2, 3]

    // 創(chuàng)建一個新的切片,并使用 copy 復(fù)制內(nèi)容
    newSlice := make([]int, len(s)) // 創(chuàng)建一個新的切片,長度與 s 相同
    copy(newSlice, s)                // 復(fù)制 s 的內(nèi)容到 newSlice

    // 現(xiàn)在,newSlice 是 s 的一個副本
    fmt.Printf("newSlice before modification: %v\n", newSlice)

    // 修改原數(shù)組
    a[3] = 10

    // 輸出結(jié)果
    fmt.Printf("Original array a: %v\n", a)            // a:[1 2 3 10 5]
    fmt.Printf("Slice s: %v\n", s)                     // s: [2 3]
    fmt.Printf("Copied slice newSlice: %v\n", newSlice) // newSlice: [2 3]
}


2.手動創(chuàng)建切片
另一個方法是直接手動創(chuàng)建一個新的切片,并使用原始切片的元素來初始化它
package main

import "fmt"

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    s := a[1:3] // 創(chuàng)建切片 s,內(nèi)容為 [2, 3]

    // 手動創(chuàng)建新切片
    newSlice := []int{s[0], s[1]} // 直接從 s 中取值初始化 newSlice

    fmt.Printf("newSlice before modification: %v\n", newSlice)

    // 修改原數(shù)組
    a[3] = 10

    // 輸出結(jié)果
    fmt.Printf("Original array a: %v\n", a)            // a:[1 2 3 10 5]
    fmt.Printf("Slice s: %v\n", s)                     // s:[2 3]
    fmt.Printf("Copied slice newSlice: %v\n", newSlice) // newSlice:[2 3]
}


使用內(nèi)置函數(shù) make 創(chuàng)建切片

package main

import "fmt"

func main() {
slice := make([]int, 5) // 創(chuàng)建一個長度為5的整數(shù)切片
fmt.Println("切片:", slice) // 輸出: [0 0 0 0 0]

    // 可以指定初始容量
    sliceWithCap := make([]int, 5, 10) // 長度為5,容量為10
    fmt.Println("切片,容量:", len(sliceWithCap), cap(sliceWithCap)) // 輸出: 5 10
}

使用字面量創(chuàng)建切片

package main

import "fmt"

func main() {
slice := []string{"蘋果", "香蕉", "橙子"}
fmt.Println("切片:", slice) // 輸出: [蘋果 香蕉 橙子]
}

判斷切片是否為空

1. 檢查切片的長度

切片的長度可以通過len函數(shù)獲取。如果切片的長度為0,則說明切片是空的。

package main

import "fmt"

func main() {
    var a []int              // 聲明一個零值切片(nil切片)
    b := []int{}            // 空切片的初始化

    fmt.Println("a is empty:", len(a) == 0) // 輸出: a is empty: true
    fmt.Println("b is empty:", len(b) == 0) // 輸出: b is empty: true

    // 還可以直接檢查長度
    if len(a) == 0 {
        fmt.Println("Slice a is empty.")
    }

    if len(b) == 0 {
        fmt.Println("Slice b is empty.")
    }
}

2. 檢查切片是否為nil

如果一個切片沒有被初始化(即沒有指向任何底層數(shù)組),它的值將是nil。你可以通過直接比較切片與nil來判斷

package main

import "fmt"

func main() {
    var a []int              // 聲明一個零值切片(nil切片)
    b := []int{}            // 一個空切片(已初始化)

    // 判斷a是否為nil
    if a == nil {
        fmt.Println("Slice a is nil.")
    } else {
        fmt.Println("Slice a is not nil.")
    }

    // 判斷b是否為nil
    if b == nil {
        fmt.Println("Slice b is nil.")
    } else {
        fmt.Println("Slice b is not nil.") // 這個會被執(zhí)行,因為b是一個空切片,已初始化
    }
}

空切片與nil切片

一個空切片(如b)雖然長度為0,但它已經(jīng)被初始化,因此b != nil。

一個未初始化的切片(如a)被視為nil,所以a == nil。

判斷切片是否為空時,通常建議同時檢查長度和是否為nil,以避免潛在的意外。

package main

import "fmt"

func isEmpty(slice []int) bool {
    return len(slice) == 0 && slice == nil
}

func main() {
    var a []int              // nil切片
    b := []int{}            // 空切片

    fmt.Println("Is slice a empty?", isEmpty(a)) // true
    fmt.Println("Is slice b empty?", isEmpty(b)) // false
}

切片不能直接比較

切片之間是不能比較的,我們不能使用==操作符來判斷兩個切片是否含有全部相等元素。

切片唯一合法的比較操作是和nil比較。 一個nil值的切片并沒有底層數(shù)組

,一個nil值的切片的長度和容量都是0。

但是我們不能說一個長度和容量都是0的切片一定是nil

切片的賦值拷貝

下面的代碼中演示了拷貝前后兩個變量共享底層數(shù)組,對一個切片的修改會影響另一個切片的內(nèi)容

func main() {
	s1 := make([]int, 3) //[0 0 0]
	s2 := s1             //將s1直接賦值給s2,s1和s2共用一個底層數(shù)組
	s2[0] = 100
	fmt.Println(s1) //[100 0 0]
	fmt.Println(s2) //[100 0 0]
}

切片遍歷

切片的遍歷方式和數(shù)組是一致的,支持索引遍歷和for range遍歷。

func main() {
	s := []int{1, 3, 5}

	for i := 0; i < len(s); i++ {
		fmt.Println(i, s[i])
	}

	for index, value := range s {
		fmt.Println(index, value)
	}
}

訪問元素

package main

import "fmt"

func main() {
    slice := []int{10, 20, 30, 40}
    fmt.Println("切片的第一個元素:", slice[0]) // 輸出: 10
}

修改元素 可以直接通過索引修改切片中的元素

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3}
    slice[1] = 5 // 修改第二個元素
    fmt.Println("修改后的切片:", slice) // 輸出: [1 5 3]
}

追加元素 使用 append 函數(shù)可以向切片追加元素。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3}
    slice = append(slice, 4, 5) // 追加多個元素
    fmt.Println("追加后的切片:", slice) // 輸出: [1 2 3 4 5]
}

切片的切割 可以通過切片操作來獲取切片的子切片

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}
    subSlice := slice[1:4] // 獲取子切片
    fmt.Println("子切片:", subSlice) // 輸出: [2 3 4]
}

切片的注意事項

切片是引用類型,這意味著多個切片可以共享同一個底層數(shù)組的部分或全部。

對一個切片的修改可能會影響到其他切片。

切片的容量會隨著元素的增加而自動增長,但每次增長會分配新的底層數(shù)組。

如果頻繁地使用 append,可以先為切片分配一個足夠大的容量,以減少內(nèi)存分配的開銷。

使用 copy 函數(shù)可以復(fù)制切片中的元素到另一個切片中。

切片的底層數(shù)組地址

func main() {
	a := [5]int{1, 2, 3, 4, 5} //定義一個數(shù)組
	//打印地址
	fmt.Printf("打印的是數(shù)組的地址 a:%p\n", &a) // a:0xc0000ae000
	s := a[0:3]
	fmt.Println(s)                    //[1 2 3]
	fmt.Printf("打印的是數(shù)組的地址 s:%p\n", s) // s:0xc0000ae000
	s1 := a[1:3]
	fmt.Println(s1)                             //[2 3]
	fmt.Printf("打印的是數(shù)組的地址 偏移了8個字節(jié) s1:%p\n", s1) // s:0xc0000ae008 (偏移了8個字節(jié))  ,不過由于切片從索引1開始,所以地址是數(shù)組的第二個元素的地址

	fmt.Printf("打印切片的地址 &s:%p\n", &s)   // &s:0xc0000081b0
	fmt.Printf("打印切片的地址 &s1:%p\n", &s1) // &s1:0xc0000081f8

	
	
}

切片本身的大小

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	// 聲明一個切片
	var intSlice []int

	// 獲取切片本身的大小
	sliceSize := unsafe.Sizeof(intSlice)

	fmt.Printf("切片大小: %d\n", sliceSize)// 切片大小: 24
}

append()方法為切片添加元素詳解

append() 函數(shù)非常靈活,可以一次添加一個或多個元素。當(dāng)切片的容量不足以容納新添加的元素時,append() 自動分配一個新的底層數(shù)組。

func append(slice []Type, elems ...Type) []Type
slice 是要添加元素的切片。
elems... 是要添加到切片中的一個或多個元素。
返回值是一個新的切片,包含原切片的所有元素和新添加的元素。

可以一次添加一個元素,可以添加多個元素,也可以添加另一個切片中的元素(后面加…)。

func main(){
	var s []int //通過var聲明的零值切片可以在append()函數(shù)直接使用,無需初始化。
	s = append(s, 1)        // [1]
	s = append(s, 2, 3, 4)  // [1 2 3 4]
	s2 := []int{5, 6, 7}
	s = append(s, s2...)    // [1 2 3 4 5 6 7]
}

切片的擴(kuò)容策略

  • 快速增長:在切片較小的情況下,選擇雙倍擴(kuò)容可以較快地滿足需求。
  • 漸進(jìn)增長:當(dāng)切片已經(jīng)較大時,使用逐步增加的方式將容量擴(kuò)增少量,這樣可以避免一次分配過大的內(nèi)存,避免可能的頻繁分配和額外的內(nèi)存壓力。
  • 防止溢出:在擴(kuò)容計算過程中,檢查容量是否溢出是很重要的,以此防止出現(xiàn)無限循環(huán)或系統(tǒng)崩潰。
newcap := old.cap //newcap 被初始化為當(dāng)前切片的容量(old.cap)。
doublecap := newcap + newcap //doublecap 是新容量的兩倍,可以為切片提供更大的擴(kuò)容空間。
if cap > doublecap { 
	newcap = cap //如果請求的新容量大于 doublecap,則直接將 newcap 設(shè)置為請求的新容量。這是一種確??梢詽M足用戶需求的方式。

} else {
	if old.len < 1024 {
		newcap = doublecap //當(dāng)當(dāng)前切片的長度小于 1024 時,newcap 設(shè)置為 doublecap,即雙倍擴(kuò)容。這樣可以快速增長容量,適用于較小的切片。
	} else {
		//當(dāng)當(dāng)前切片的長度大于或等于 1024 時,使用一個循環(huán)逐步增加容量:
        //在每次循環(huán)中, newcap 增加其自身的四分之一,直到 newcap 大于等于請求的新容量 cap。
        //這個檢查 0 < newcap 是為了防止 newcap 發(fā)生溢出,從而導(dǎo)致無限循環(huán)。
		for 0 < newcap && newcap < cap {
			newcap += newcap / 4
		}
	    //如果在調(diào)整容量時出現(xiàn)溢出(即 newcap <= 0),則將 newcap 設(shè)置為請求的新容量 cap。

		if newcap <= 0 {
			newcap = cap
		}
	}
}



從切片中刪除元素

切片是一種動態(tài)數(shù)組,刪除切片中的元素通常涉及到重新創(chuàng)建切片以排除指定的元素。由于切片是引用類型,刪除操作并不會改變原始切片的長度和容量,而是通過切片的重新切割來達(dá)到節(jié)省存儲空間的效果。

使用切片重組:

最簡單的方式是通過切片的組合將要刪除的元素排除。假設(shè)我們有一個整數(shù)切片,并希望刪除指定索引的元素

package main

import "fmt"

func removeAtIndex(slice []int, index int) []int {
    // 檢查索引是否有效
    if index < 0 || index >= len(slice) {
        return slice // 返回原切片
    }
    // 將切片分為兩部分并組合
    return append(slice[:index], slice[index+1:]...) // 刪除索引 index 處的元素
}

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    fmt.Println("初始切片:", numbers)

    // 刪除索引為 2 的元素(值為 3)
    numbers = removeAtIndex(numbers, 2)
    fmt.Println("刪除后的切片:", numbers) // 輸出: [1 2 4 5]
}

刪除多個元素:

如果要刪除多個元素,可以使用循環(huán)并根據(jù)條件過濾元素。

package main

import "fmt"

func removeElements(slice []int, value int) []int {
    result := []int{}
    for _, v := range slice {
        if v != value { // 僅保留不等于 value 的元素
            result = append(result, v)
        }
    }
    return result
}

func main() {
    numbers := []int{1, 2, 3, 4, 3, 5}
    fmt.Println("初始切片:", numbers)

    // 刪除值為 3 的所有元素
    numbers = removeElements(numbers, 3)
    fmt.Println("刪除后的切片:", numbers) // 輸出: [1 2 4 5]
}

使用 copy 函數(shù):

有時,我們會希望在刪除元素后保留原切片中的數(shù)據(jù)結(jié)構(gòu)。可以使用 copy 函數(shù)來實現(xiàn)。

package main

import "fmt"

func removeAtIndexUsingCopy(slice []int, index int) []int {
	if index < 0 || index >= len(slice) {
		return slice // 返回原切片
	}
	// 使用 copy 函數(shù)
	copy(slice[index:], slice[index+1:]) // 將后面的元素前移
	return slice[:len(slice)-1]          // 切割到減少后的長度
}

func main() {
	numbers := []int{1, 2, 3, 4, 5}
	fmt.Println("初始切片:", numbers)

	// 刪除索引為 2 的元素(值為 3)
	newNumbers := removeAtIndexUsingCopy(numbers, 2)
	fmt.Println("初始切片:", numbers) // 輸出: [1 2 4 5]
	fmt.Println("刪除后的切片:", newNumbers) // 輸出: [1 2 4 5]
}


以上示例展示了從切片中刪除元素的幾種不同方法

在使用這些方法時,注意以下幾點(diǎn):

  • 指針和引用:切片是引用類型,刪除元素的過程通常通過新切片引用來實現(xiàn),并不會改變原切片本身的內(nèi)存結(jié)構(gòu)。
  • 性能考慮:在刪除大量元素時,要考慮性能,循環(huán)和過濾可能會導(dǎo)致較大開銷,如果只需要刪除一個元素,使用簡單的切割方式會更高效。
  • 負(fù)索引檢查:確保在進(jìn)行刪除操作時對索引或元素值進(jìn)行有效性檢查,避免運(yùn)行時錯誤。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 源碼剖析Golang中singleflight的應(yīng)用

    源碼剖析Golang中singleflight的應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了如何利用singleflight來避免緩存擊穿,并剖析singleflight包的源碼實現(xiàn)和工作原理,感興趣的可以了解下
    2024-03-03
  • golang中常見的logrus日志庫

    golang中常見的logrus日志庫

    這篇文章主要介紹了golang中常見的logrus日志庫的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解

    Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解

    Stream?的實現(xiàn)思想就是將數(shù)據(jù)處理流程抽象成了一個數(shù)據(jù)流,每次加工后返回一個新的流供使用。這篇文章主要介紹了Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù),需要的朋友可以參考下
    2022-01-01
  • Golang設(shè)計模式之適配器模式介紹和代碼示例

    Golang設(shè)計模式之適配器模式介紹和代碼示例

    適配器是一種結(jié)構(gòu)型設(shè)計模式, 它能使不兼容的對象能夠相互合作,可擔(dān)任兩個對象間的封裝器, 它會接收對于一個對象的調(diào)用, 并將其轉(zhuǎn)換為另一個對象可識別的格式和接口,本文將通過代碼示例詳細(xì)給大家介紹Golang的適配器模式
    2023-06-06
  • GO語言make和new關(guān)鍵字的區(qū)別

    GO語言make和new關(guān)鍵字的區(qū)別

    本篇文章來介紹一道非常常見的面試題,到底有多常見呢?可能很多面試的開場白就是由此開始的。那就是?new?和?make?這兩個內(nèi)置函數(shù)的區(qū)別,希望對大家有所幫助
    2023-04-04
  • Go語言小白入門刷題打印輸出沙漏

    Go語言小白入門刷題打印輸出沙漏

    這篇文章主要介紹了Go語言刷題打印輸出沙漏的示例過程詳解,非常適合剛?cè)腴TGo語言的小白學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Golang 端口復(fù)用測試的實現(xiàn)

    Golang 端口復(fù)用測試的實現(xiàn)

    這篇文章主要介紹了Golang 端口復(fù)用測試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go時間操作常用方法(推薦!)

    Go時間操作常用方法(推薦!)

    平時開發(fā)過程中,時間相關(guān)的操作用的還是很多的,下面這篇文章主要給大家介紹了關(guān)于Go時間操作常用方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • go帶緩沖chan實現(xiàn)消息隊列功能

    go帶緩沖chan實現(xiàn)消息隊列功能

    本文主要介紹了go帶緩沖chan實現(xiàn)消息隊列功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 利用Golang實現(xiàn)對配置文件加密

    利用Golang實現(xiàn)對配置文件加密

    在實際的應(yīng)用中,配置文件通常包含了一些敏感的信息,如數(shù)據(jù)庫密碼、API密鑰等,為了保護(hù)這些敏感信息不被惡意獲取,我們可以對配置文件進(jìn)行加密,本文將介紹如何使用Go語言實現(xiàn)對配置文件的加密,需要的朋友可以參考下
    2023-10-10

最新評論

九龙县| 潞城市| 钦州市| 辰溪县| 富裕县| 姜堰市| 保山市| 马鞍山市| 铅山县| 新乡市| 南召县| 玛曲县| 邢台县| 贵阳市| 金坛市| 玛曲县| 陈巴尔虎旗| 明水县| 明水县| 合肥市| 额敏县| 鹤峰县| 南皮县| 康定县| 万山特区| 广宗县| 中宁县| 曲沃县| 拜城县| 翼城县| 泰兴市| 长泰县| 光山县| 德格县| 桐乡市| 鸡泽县| 五常市| 长汀县| 高陵县| 安岳县| 宝山区|