Golang의 슬라이스를 간략하게 분석하는 기사
이 기사는 Go 언어에 대해 설명하고 Slice에 대해 Go 언어의 기본 사항에 대해 설명하는 데 도움이 되기를 바랍니다.
1. 슬라이스 정의
이전 섹션에서 배열의 길이는 고정되어 있고 배열 길이는 유형의 일부이므로 배열 a에는 이미 세 개의 요소가 있다는 것을 알았습니다. 계속할 수 없습니다. 새 요소가 배열 a에 추가되었습니다. js에서는 배열이나 다른 작업에 요소를 추가하는 것이 일반적입니다. 그러면 go로 무엇을 해야 할까요? 오늘은 슬라이싱(slicing)에 중점을 둘 것입니다. [프로그래밍 튜토리얼 추천: 프로그래밍 교육]
Slice는 동일한 유형의 요소로 구성된 가변 길이 시퀀스입니다. 배열 유형을 기반으로 한 캡슐화 계층입니다. 매우 유연하며 자동 확장을 지원합니다. 슬라이스는 참조 유형이며 내부 구조에는 주소
, 길이
및 용량
이 포함됩니다. 슬라이스는 일반적으로 데이터 모음에 대해 신속하게 작업하는 데 사용됩니다. 地址
、长度
和容量
。切片一般用于快速地操作一块数据集合。
声明切片类型的基本语法如下:
var name []T
其中,
- name:表示变量名
- T:表示切片中的元素类型
func main() { // 声明切片类型 var a []string //声明一个字符串切片 var b = []int{} //声明一个整型切片并初始化 var c = []bool{false, true} //声明一个布尔切片并初始化 var d = []bool{false, true} //声明一个布尔切片并初始化 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比较 }
2.简单切片表达式
切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low
和high
表示一个索引范围(左包含,右不包含),也就是下面代码中从数组a中选出1<=索引值<4
的元素组成切片s,得到的切片长度=high-low
,容量等于得到的切片的底层数组的容量。
func main() { a := [5]int{1, 2, 3, 4, 5} s := a[1:3] // s := a[low:high] fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s)) } 输出: a[2:] // 等同于 a[2:len(a)] a[:3] // 等同于 a[0:3] a[:] // 等同于 a[0:len(a)]
3.完整切片表达式
对于数组,指向数组的指针,或切片a(注意不能是字符串)支持完整切片表达式
a[low : high : max]
上面的代码会构造与简单切片表达式a[low: high]
相同类型、相同长度和元素的切片。另外,它会将得到的结果切片的容量设置为max-low
。在完整切片表达式中只有第一个索引值(low)可以省略;它默认为0。
func main() { a := [5]int{1, 2, 3, 4, 5} t := a[1:3:5] fmt.Printf("t:%v len(t):%v cap(t):%v\n", t, len(t), cap(t)) } 输出: t:[2 3] len(t):2 cap(t):4
完整切片表达式需要满足的条件是0 <= low <= high <= max <= cap(a)
,其他条件和简单切片表达式相同。
4.使用make()函数构造切片
我们上面都是基于数组来创建的切片,如果需要动态的创建一个切片,我们就需要使用内置的make()
函数,格式如下:
make([]T, size, cap)
其中:
- T:切片的元素类型
- size:切片中元素的数量
- cap:切片的容量
func main() { a := make([]int, 2, 10) fmt.Println(a) //[0 0] fmt.Println(len(a)) //2 fmt.Println(cap(a)) //10 }
上面代码中a
的内部存储空间已经分配了10个,但实际上只用了2个。 容量并不会影响当前元素的个数,所以len(a)
返回2,cap(a)
则返回该切片的容量。
5.判断切片是否为空
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。
切片之间是不能比较的,我们不能使用==
操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil
比较。 一个nil
值的切片并没有底层数组,一个nil
值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil
,例如下面的示例:
var s1 []int //len(s1)=0;cap(s1)=0;s1==nil s2 := []int{} //len(s2)=0;cap(s2)=0;s2!=nil s3 := make([]int, 0) //len(s3)=0;cap(s3)=0;s3!=nil
要检查切片是否为空,请始终使用len(s) == 0
来判断,而不应该使用s == nil
来判断。
6.切片的赋值拷贝
拷贝前后两个变量共享底层数组,对一个切片的修改会影响另一个切片的内容,这点需要特别注意。
func main() { s1 := make([]int, 3) //[0 0 0] s2 := s1 //将s1直接赋值给s2,s1和s2共用一个底层数组 s2[0] = 100 fmt.Println(s1) //[100 0 0] fmt.Println(s2) //[100 0 0] }
7.切片遍历
切片的遍历方式和数组是一致的,支持索引遍历和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) } }
8.append()方法为切片添加元素
Go语言的内建函数append()
可以为切片动态添加元素。 可以一次添加一个元素,可以添加多个元素,也可以添加另一个切片中的元素(后面加…)。
func main(){ var s []int 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] }
通过var声明的零值切片可以在append()
var s []ints = append(s, 1, 2, 3)
- name: 변수 이름을 나타냅니다.
- T: 슬라이스의 요소 유형을 나타냅니다.< /li>
func main() { a := []int{1, 2, 3, 4, 5} b := a fmt.Println(a) //[1 2 3 4 5] fmt.Println(b) //[1 2 3 4 5] b[0] = 1000 fmt.Println(a) //[1000 2 3 4 5] fmt.Println(b) //[1000 2 3 4 5] }
🎜2. 간단한 슬라이스 표현식🎜🎜🎜슬라이스의 맨 아래 레이어는 배열이므로 슬라이스 표현식 기반으로 슬라이스를 얻을 수 있습니다. 배열에. 조각화 표현식의 low
및 high
는 인덱스 범위(왼쪽에는 포함, 오른쪽에는 포함되지 않음)를 나타냅니다. 즉, 다음 코드는 배열 a에서 1<를 선택합니다. =인덱스 값이 <4
인 요소는 슬라이스 s를 형성하고, 획득된 슬라이스는 length=high-low
이며, 용량은 획득된 슬라이스의 기본 배열의 용량과 같습니다. 🎜copy(destSlice, srcSlice []T)
로그인 후 복사로그인 후 복사🎜3. 완전한 슬라이스 표현식🎜🎜🎜배열의 경우 배열에 대한 포인터 또는 슬라이스 a(🎜문자열일 수 없음🎜)는 전체 슬라이스 표현식을 지원합니다🎜 func main() {
// copy()复制切片
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5, 5)
copy(c, a) //使用copy()函数将切片a中的元素复制到切片c
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1 2 3 4 5]
c[0] = 1000
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1000 2 3 4 5]
}
로그인 후 복사로그인 후 복사🎜 위의 코드는 단순 슬라이스 표현식 a[low: high]
와 동일한 유형, 동일한 길이 및 요소의 슬라이스를 구성합니다. 또한 결과 슬라이스의 용량을 max-low
로 설정합니다. 전체 슬라이싱 표현식에서는 첫 번째 인덱스 값(low)만 생략할 수 있으며 기본값은 0입니다. 🎜func main() {
// 从切片中删除元素
a := []int{30, 31, 32, 33, 34, 35, 36, 37}
// 要删除索引为2的元素
a = append(a[:2], a[3:]...)
fmt.Println(a) //[30 31 33 34 35 36 37]
}
로그인 후 복사로그인 후 복사🎜완전한 슬라이스 표현식이 만족해야 하는 조건은 0 <= low <= high <= max <= cap(a)
이고, 그 외의 조건은 단순과 동일합니다. 슬라이스 표현. 🎜🎜4 make() 함수를 사용하여 슬라이스를 생성합니다🎜🎜🎜우리는 모두 배열을 기반으로 슬라이스를 생성했습니다. 내장 사용 make()
함수의 형식은 다음과 같습니다: 🎜rrreee🎜여기서: 🎜- T: 슬라이스의 요소 유형
- 크기 : 슬라이스의 요소 수
li>- cap: 슬라이스의 용량
rrreee🎜위 코드에서 a</code의 내부 저장 공간은 10개입니다. > 할당되었으나 실제로는 2개만 사용됩니다. 용량은 현재 요소 수에 영향을 주지 않으므로 <code>len(a)
는 2를 반환하고 cap(a)
는 슬라이스의 용량을 반환합니다. 🎜🎜5. 슬라이스가 비어 있는지 확인🎜🎜🎜슬라이스의 핵심은 기본 배열을 캡슐화하는 것입니다. 여기에는 기본 배열의 포인터라는 세 가지 정보가 포함됩니다. 슬라이스의 길이(len)와 슬라이스의 용량(cap)입니다. 🎜🎜슬라이스를 비교할 수 없습니다. ==
연산자를 사용하여 두 슬라이스에 모두 동일한 요소가 포함되어 있는지 확인할 수 없습니다. 슬라이스에 대한 유일한 합법적인 비교 연산은 nil
입니다. nil
값 조각에는 기본 배열이 없으며 nil
값 조각의 길이와 용량은 모두 0입니다. 그러나 다음 예와 같이 길이와 용량이 0인 슬라이스가 nil
이어야 한다고 말할 수는 없습니다. 🎜rrreee🎜슬라이스가 비어 있는지 확인하려면 항상 len(s)을 사용하세요. ) = = 0
대신 s == nil
. 🎜🎜6. 슬라이스 복사 할당 🎜🎜🎜복사 전과 후의 두 변수는 기본 배열을 공유합니다. 한 슬라이스를 수정하면 다른 슬라이스의 내용에 영향을 미칩니다. 주목. . 🎜rrreee🎜7. 슬라이스 순회 🎜🎜🎜슬라이스의 순회 방법은 배열의 순회 방법과 동일하며 인덱스 순회 및 범위
순회를 지원합니다. . 🎜rrreee🎜8.append() 메소드는 슬라이스에 요소를 추가합니다🎜🎜🎜Go 언어의 내장 함수 append()
는 동적으로 슬라이스에 요소를 추가할 수 있습니다. 슬라이스. 한 번에 하나의 요소를 추가하거나, 여러 요소를 추가하거나, 다른 슬라이스의 요소(뒤에...)를 추가할 수 있습니다. 🎜rrreee🎜var를 통해 선언된 0값 슬라이스는 초기화 없이 append()
함수에서 직접 사용할 수 있습니다. 🎜var s []ints = append(s, 1, 2, 3)
로그인 후 복사로그인 후 복사
copy(destSlice, srcSlice []T)
func main() { // copy()复制切片 a := []int{1, 2, 3, 4, 5} c := make([]int, 5, 5) copy(c, a) //使用copy()函数将切片a中的元素复制到切片c fmt.Println(a) //[1 2 3 4 5] fmt.Println(c) //[1 2 3 4 5] c[0] = 1000 fmt.Println(a) //[1 2 3 4 5] fmt.Println(c) //[1000 2 3 4 5] }
a[low: high]
와 동일한 유형, 동일한 길이 및 요소의 슬라이스를 구성합니다. 또한 결과 슬라이스의 용량을 max-low
로 설정합니다. 전체 슬라이싱 표현식에서는 첫 번째 인덱스 값(low)만 생략할 수 있으며 기본값은 0입니다. 🎜func main() { // 从切片中删除元素 a := []int{30, 31, 32, 33, 34, 35, 36, 37} // 要删除索引为2的元素 a = append(a[:2], a[3:]...) fmt.Println(a) //[30 31 33 34 35 36 37] }
0 <= low <= high <= max <= cap(a)
이고, 그 외의 조건은 단순과 동일합니다. 슬라이스 표현. 🎜🎜4 make() 함수를 사용하여 슬라이스를 생성합니다🎜🎜🎜우리는 모두 배열을 기반으로 슬라이스를 생성했습니다. 내장 사용 make()
함수의 형식은 다음과 같습니다: 🎜rrreee🎜여기서: 🎜- T: 슬라이스의 요소 유형
- 크기 : 슬라이스의 요소 수
li>- cap: 슬라이스의 용량
rrreee🎜위 코드에서 a</code의 내부 저장 공간은 10개입니다. > 할당되었으나 실제로는 2개만 사용됩니다. 용량은 현재 요소 수에 영향을 주지 않으므로 <code>len(a)
는 2를 반환하고 cap(a)
는 슬라이스의 용량을 반환합니다. 🎜🎜5. 슬라이스가 비어 있는지 확인🎜🎜🎜슬라이스의 핵심은 기본 배열을 캡슐화하는 것입니다. 여기에는 기본 배열의 포인터라는 세 가지 정보가 포함됩니다. 슬라이스의 길이(len)와 슬라이스의 용량(cap)입니다. 🎜🎜슬라이스를 비교할 수 없습니다. ==
연산자를 사용하여 두 슬라이스에 모두 동일한 요소가 포함되어 있는지 확인할 수 없습니다. 슬라이스에 대한 유일한 합법적인 비교 연산은 nil
입니다. nil
값 조각에는 기본 배열이 없으며 nil
값 조각의 길이와 용량은 모두 0입니다. 그러나 다음 예와 같이 길이와 용량이 0인 슬라이스가 nil
이어야 한다고 말할 수는 없습니다. 🎜rrreee🎜슬라이스가 비어 있는지 확인하려면 항상 len(s)을 사용하세요. ) = = 0
대신 s == nil
. 🎜🎜6. 슬라이스 복사 할당 🎜🎜🎜복사 전과 후의 두 변수는 기본 배열을 공유합니다. 한 슬라이스를 수정하면 다른 슬라이스의 내용에 영향을 미칩니다. 주목. . 🎜rrreee🎜7. 슬라이스 순회 🎜🎜🎜슬라이스의 순회 방법은 배열의 순회 방법과 동일하며 인덱스 순회 및 범위
순회를 지원합니다. . 🎜rrreee🎜8.append() 메소드는 슬라이스에 요소를 추가합니다🎜🎜🎜Go 언어의 내장 함수 append()
는 동적으로 슬라이스에 요소를 추가할 수 있습니다. 슬라이스. 한 번에 하나의 요소를 추가하거나, 여러 요소를 추가하거나, 다른 슬라이스의 요소(뒤에...)를 추가할 수 있습니다. 🎜rrreee🎜var를 통해 선언된 0값 슬라이스는 초기화 없이 append()
함수에서 직접 사용할 수 있습니다. 🎜var s []ints = append(s, 1, 2, 3)
로그인 후 복사로그인 후 복사
==
연산자를 사용하여 두 슬라이스에 모두 동일한 요소가 포함되어 있는지 확인할 수 없습니다. 슬라이스에 대한 유일한 합법적인 비교 연산은 nil
입니다. nil
값 조각에는 기본 배열이 없으며 nil
값 조각의 길이와 용량은 모두 0입니다. 그러나 다음 예와 같이 길이와 용량이 0인 슬라이스가 nil
이어야 한다고 말할 수는 없습니다. 🎜rrreee🎜슬라이스가 비어 있는지 확인하려면 항상 len(s)을 사용하세요. ) = = 0
대신 s == nil
. 🎜🎜6. 슬라이스 복사 할당 🎜🎜🎜복사 전과 후의 두 변수는 기본 배열을 공유합니다. 한 슬라이스를 수정하면 다른 슬라이스의 내용에 영향을 미칩니다. 주목. . 🎜rrreee🎜7. 슬라이스 순회 🎜🎜🎜슬라이스의 순회 방법은 배열의 순회 방법과 동일하며 인덱스 순회 및 범위
순회를 지원합니다. . 🎜rrreee🎜8.append() 메소드는 슬라이스에 요소를 추가합니다🎜🎜🎜Go 언어의 내장 함수 append()
는 동적으로 슬라이스에 요소를 추가할 수 있습니다. 슬라이스. 한 번에 하나의 요소를 추가하거나, 여러 요소를 추가하거나, 다른 슬라이스의 요소(뒤에...)를 추가할 수 있습니다. 🎜rrreee🎜var를 통해 선언된 0값 슬라이스는 초기화 없이 append()
함수에서 직접 사용할 수 있습니다. 🎜var s []ints = append(s, 1, 2, 3)
로그인 후 복사로그인 후 복사
범위
순회를 지원합니다. . 🎜rrreee🎜8.append() 메소드는 슬라이스에 요소를 추가합니다🎜🎜🎜Go 언어의 내장 함수 append()
는 동적으로 슬라이스에 요소를 추가할 수 있습니다. 슬라이스. 한 번에 하나의 요소를 추가하거나, 여러 요소를 추가하거나, 다른 슬라이스의 요소(뒤에...)를 추가할 수 있습니다. 🎜rrreee🎜var를 통해 선언된 0값 슬라이스는 초기화 없이 append()
함수에서 직접 사용할 수 있습니다. 🎜var s []ints = append(s, 1, 2, 3)
로그인 후 복사로그인 후 복사
var s []ints = append(s, 1, 2, 3)
每个切片会指向一个底层数组,这个数组的容量够用就添加新增元素。当底层数组不能容纳新增的元素时,切片就会自动按照一定的策略进行“扩容”,此时该切片指向的底层数组就会更换。“扩容”操作往往发生在append()
函数调用时,所以我们通常都需要用原变量接收append函数的返回值。
9.使用copy()函数复制切片
由于切片是引用类型,所以a和b其实都指向了同一块内存地址。修改b的同时a的值也会发生变化。
func main() { a := []int{1, 2, 3, 4, 5} b := a fmt.Println(a) //[1 2 3 4 5] fmt.Println(b) //[1 2 3 4 5] b[0] = 1000 fmt.Println(a) //[1000 2 3 4 5] fmt.Println(b) //[1000 2 3 4 5] }
Go语言内建的copy()
函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()
函数的使用格式如下:
copy(destSlice, srcSlice []T)
其中:
- srcSlice: 数据来源切片
- destSlice: 目标切片
func main() { // copy()复制切片 a := []int{1, 2, 3, 4, 5} c := make([]int, 5, 5) copy(c, a) //使用copy()函数将切片a中的元素复制到切片c fmt.Println(a) //[1 2 3 4 5] fmt.Println(c) //[1 2 3 4 5] c[0] = 1000 fmt.Println(a) //[1 2 3 4 5] fmt.Println(c) //[1000 2 3 4 5] }
10.从切片中删除元素
Go语言中并没有删除切片元素的专用方法,我们可以使用切片本身的特性来删除元素。
func main() { // 从切片中删除元素 a := []int{30, 31, 32, 33, 34, 35, 36, 37} // 要删除索引为2的元素 a = append(a[:2], a[3:]...) fmt.Println(a) //[30 31 33 34 35 36 37] }
要从切片a中删除索引为index
的元素,操作方法是a = append(a[:index], a[index+1:]...)
结束:
再次提醒,需要进技术交流群
的同学,可以加我微信fangdongdong_25
,需要进前端工程师交流群的备注“前端”
,需要进go后端交流群的备注“go后端”
【相关推荐:Go视频教程】
위 내용은 Golang의 슬라이스를 간략하게 분석하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

Go Language는 효율적이고 확장 가능한 시스템을 구축하는 데 잘 작동합니다. 장점은 다음과 같습니다. 1. 고성능 : 기계 코드로 컴파일, 빠른 달리기 속도; 2. 동시 프로그래밍 : 고어 라틴 및 채널을 통한 멀티 태스킹 단순화; 3. 단순성 : 간결한 구문, 학습 및 유지 보수 비용 절감; 4. 크로스 플랫폼 : 크로스 플랫폼 컴파일, 쉬운 배포를 지원합니다.

Golang은 성능과 확장 성 측면에서 Python보다 낫습니다. 1) Golang의 컴파일 유형 특성과 효율적인 동시성 모델은 높은 동시성 시나리오에서 잘 수행합니다. 2) 해석 된 언어로서 파이썬은 천천히 실행되지만 Cython과 같은 도구를 통해 성능을 최적화 할 수 있습니다.

GO 프로그래밍의 자원 관리 : MySQL 및 Redis는 특히 데이터베이스 및 캐시를 통해 리소스를 올바르게 관리하는 방법을 배우는 데 연결 및 릴리스 ...

Golang은 동시성에서 C보다 낫고 C는 원시 속도에서 Golang보다 낫습니다. 1) Golang은 Goroutine 및 Channel을 통해 효율적인 동시성을 달성하며, 이는 많은 동시 작업을 처리하는 데 적합합니다. 2) C 컴파일러 최적화 및 표준 라이브러리를 통해 하드웨어에 가까운 고성능을 제공하며 극도의 최적화가 필요한 애플리케이션에 적합합니다.

Golang은 빠른 개발 및 동시 시나리오에 적합하며 C는 극도의 성능 및 저수준 제어가 필요한 시나리오에 적합합니다. 1) Golang은 쓰레기 수집 및 동시성 메커니즘을 통해 성능을 향상시키고, 고전성 웹 서비스 개발에 적합합니다. 2) C는 수동 메모리 관리 및 컴파일러 최적화를 통해 궁극적 인 성능을 달성하며 임베디드 시스템 개발에 적합합니다.
