Slice usage of Go language learning notes

Source: Internet
Author: User
This is a creation in Article, where the information may have evolved or changed.


First, the concept of slice:

Slices (slice) Slice is the concept that the previous structure contains three fields: the pointer, length, and capacity of an array. The slice supports the [] operator to access the elements of the underlying array. The length of the slice returned by the built-in Len function. The built-in Cap function returns the capacity of the slice.

A slice is a reference type, which means that if you assign a slice to another slice, the two slices will reference the same underlying array.

Second, how to create slice

The following two methods are available for creating tiles:

(1) Create directly:

S: = make ([]int, 10)

An integer type slice named S, with 10 elements (length equal to 10) is created

If you do not assign a value to slice after creation, the value of slice is the default value for creating the type, such as:

Packagemain

Import "FMT"

Funcmain () {

S:=make ([]int,10)

Fmt. PRINTLN (s)

}

Output

[0000000000]


Or

s: = []int{1,2,3,4,5}

An integer type slice named S with 5 elements is created, and each element is assigned a value of 1,2,3,4,5

(2) Indirect establishment:

First build array A and then create slices with arrays s

var a [10]int

S: = A[1:5]//a[1],a[2],a[3],a[4]

Created an integer type slice named s length of 4 capacity of 10, that is Len (s) equals 4,cap (s) equals 10 (the effect is similar to using make ([]int,4, 10))

Slice s point to array a[1],a[2],a[3],a[4]

When the value of array a changes, the value of the slice s also changes, because the slice s refers to the array a

(If multiple slices point to the same array, the values of the multiple slices that point to it change when the underlying array value changes)

You can also re-specify:

s = a[0:8]//s point to array a[0] to a[7]

s = s[2:5]//s points to the s[2],s[3],s[4 of the original slice] three elements.

Always point to X to y-1 elements when using [x:y]

When x is the first element or y is the last element, you can omit not to write

Package Main

Import "FMT"

Func Main () {

Vara = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

s:= A[1:5]//Represents the element value in the A array ah a[1] to a[4]

Fmt. Println (s)//output: [2 3 4 5]

a[2]= 21

Fmt. Println (s)//output:[2 21 4 5], indicating that the slice s and array a point to the same memory space

}

Output

[2 3 4 5]

[2 21 4 5]


add element:

Use the Append function to increase the length of the slice

s: = []int{1,2,3}//Build section S

s = Append (S, 4, 5)//When appending is a value (can be 1 or more)

It adds two elements to the slice s and assigns a value of 4 and 5

You can also append slices to slices

A: = []int{6, 7}//Build Slice A

s = Append (S,a ...) When you append a slice, there are three points behind it.

Append slice A to slice s to obtain S equals [1,2,3,4,5,6,7]

s = Append (S[2:5],a ...) To obtain S equals [3,4,5,6,7]

When the number of appended elements is greater than the capacity of this slice, the function append is

The original slice s re-allocates space, so s does not reference the original array or the appended array

If not ... will report an error and not be able to work; This is the difference between the append value and the Append slice

Package Main

Import "FMT"

Func Main () {

s:= []int{1, 2, 3}//Building a slice s

s= Append (S, 4, 5)//When appending is a value (can be 1 or more)

Fmt. PRINTLN (s)

a:= []int{6, 7}//Building a slice

s= Append (S, a ...)//When a slice is appended, there are three points behind it

Fmt. PRINTLN (s)

s= append (S[2:5], a ...)//Draw S equals [3,4,5,6,7]

Fmt. PRINTLN (s)

}

Output

[1 2 3 4 5]

[1 2 3 4 5 6 7]

[3 4 5 6 7]


and a function copy.

The copy function is used to copy data from one array or slice to another slice

N1: = Copy (S, A[x:y])

Copy array or slice A into s and reverse the number of elements copied to N1

A can be an array or a slice, but s can only be slices

The value of the array element is copied instead of the reference

The number of elements copied is Len (A[x:y]) and the lesser of Len (s)

Cases:

var a = [...] Int{0, 1, 2, 3, 4, 5, 6, 7}

var s = make ([]int, 6)

N1: = Copy (S, a[:])//Description: Copy all values of a to S

N2: = Copy (S, s[2:])//Description: Copy the value of the specified range to the start of S

N3: = Copy (S[4:6], a[6:8])//Description: Copy the value of the specified range to the specified position of s

Package Main

Import "FMT"

Func Main () {

Vara = [...] Int{0, 1, 2, 3, 4, 5, 6, 7}

VARs = Make ([]int, 6)

n1:= copy (S, a[:])//Description: Copy all values of a to S

Fmt. PRINTLN (n1)//Number of assignments

Fmt. PRINTLN (s)//Result after assignment

n2:= copy (S, s[2:])//Description: Copy the value of the specified range to the start of S

Fmt. Println (N2)

Fmt. PRINTLN (s)

n3:= copy (S[4:6], a[6:8])//Description: Copy the value of the specified range to the specified position of s

Fmt. Println (N3)

Fmt. PRINTLN (s)

}

Output

6

[0 1 2 3 4 5]

4

[2 3 4 5 4 5]

2

[2 3 4 5 6 7]

Third, note:

Slice is a pointer rather than a value.

The pointer ratio is much smaller, so we'll pass the slice as a function parameter.

Array is more performance-pass as a function parameter.

Slice is a pointer to an array mechanism that has two basic functions

Len and Cap.

Look at the following illustration:


Slice is a pointer to an array with a point, Len (the number of actual values in the array), CAP (the capacity of the array)

For example, above this slice, it points to the array is [3]int, where the first two have values, the third is empty

So

Len (slic) = 2

Cap (SLIC) = 3

The APPEND function is understood to add a value to the slice, if it does not reach the capacity (LEN<CAP) then add the value directly to the array, if it reaches the capacity (len = cap) then add a new element space, put the value inside

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.