龙空技术网

golang 切片类型Slices (非常常用)

韩宏敏思密达 307

前言:

当前我们对“slices是什么”大约比较关心,各位老铁们都需要剖析一些“slices是什么”的相关资讯。那么小编同时在网上收集了一些对于“slices是什么””的相关内容,希望朋友们能喜欢,咱们快快来了解一下吧!

在Go 语言中, Slices (切片)是比较重要的数据类型, 比arrays (数组)更强大, 在实际编程过程中也更常用;

基本使用

package mainimport "fmt"func main() {  //使用内置函数make 初始化一个size 为3 的切片  s := make([]string, 3)  fmt.Println("长度:", len(s), "容量:", cap(s))  fmt.Println("s:", s)  fmt.Printf("s 的地址:%p \n", &s)  s[0] = "a"  s[1] = "b"  s[2] = "c"  fmt.Println("s:", s)  fmt.Println("s[1]:", s[1])  //使用内置函数append 追加一个元素  s = append(s, "d")  fmt.Println("长度:", len(s), "容量:", cap(s))//注意此处容量变化  fmt.Println("s:", s)  fmt.Printf("s 的地址:%p \n", &s)}//长度: 3 容量: 3//s: [  ]//s 的地址:0xc00011a020 //s: [a b c]//s[1]: b//长度: 4 容量: 6//s: [a b c d]//s 的地址:0xc00011a020 
切片操作

此处 为动词...

//切片操作, 左包右不包, 如`[1:3]`表示从索引1到3, 包含1不包含3  s2 := []string{"a", "b", "c", "d"}  fmt.Println(s2[:2])  fmt.Println(s2[1:3])  fmt.Println(s2[2:])  fmt.Println(s2[2:3])//[a b]//[b c]//[c d]//[c]
多维切片

构建一个二维字符串切片, 4x4 大小, 值为标记坐标;

//二维字符串切片, 4x4  s2d := make([][]string, 4)  for i := 0; i < len(s2d); i++ {    s2d[i] = make([]string, 4)    for j := 0; j < len(s2d[i]); j++ {      //strings.Join([]string{strconv.Itoa(i), strconv.Itoa(j)}, "-") 速度比fmt 快      p := fmt.Sprintf("%d-%d", i, j)      s2d[i][j] = p    }  }  for _, row := range s2d {    fmt.Println(row)  }//[0-0 0-1 0-2 0-3]//[1-0 1-1 1-2 1-3]//[2-0 2-1 2-2 2-3]//[3-0 3-1 3-2 3-3]
基于切片实现一个简单的先进先出队列
package mainimport "fmt"//定义一个结构体type FIFOQueue struct {  elements []int}//Push 函数func (q *FIFOQueue) Push(e int) {  q.elements = append(q.elements, e)}//Pop 函数func (q *FIFOQueue) Pop() (e int) {  x := q.elements[0]  q.elements = q.elements[1:]  return x}//是否为空func (q *FIFOQueue) Empty() bool {  return len(q.elements) == 0}//当前长度func (q *FIFOQueue) Length() int {  return len(q.elements)}//可以被其他包调用的New 函数func NewQueue() *FIFOQueue {  q := FIFOQueue{    elements: make([]int, 0),  }  return &q}func main() {  q := NewQueue()  fmt.Println("is empty:", q.Empty())  q.Push(1)  q.Push(2)  q.Push(3)  fmt.Println("is empty:", q.Empty())  fmt.Println("length:", q.Length())  for {    fmt.Println("element:", q.Pop())    if q.Empty() {      break    }  }}

注: `golang` 中并发编程理念是: 不要通过共享内存来通信,而要通过通信来共享内存.

一般使用`channel` 进行通信, 而不是使用锁机制.

区别于`java`, `java` 中的队列结构都会明确告知是否线程安全, 上文示例未考虑这些.

#Golang# #切片#

标签: #slices是什么