More Related Content
Similar to Go言語のスライスを理解しよう (20)
More from Yasutaka Kawamoto (7)
Go言語のスライスを理解しよう
- 2. 自己紹介
• 河本 泰孝 @yasi_life → @kwmt27
• 私とGo言語との関わり
• 2011年のDevQuizで初めて触った
• 2012年1月のGo言語勉強会に参加
• 2012年4月の東海GTUGさんのGAE
勉強会でGoを使った
- 3. 自己紹介
• 最近では公式サイトの
• Writing Web Applications
• Go Slices
を翻訳してみたり。
https://github.com/
kwmt/golangwiki/wiki
- 22. (1)スライスの特徴
make関数とは
make関数の書式
func make([]T, len, cap) []T
T:要素の型
len:長さ(length)
cap:容量(capacity)(オプション)
- 23. (1)スライスの特徴
make関数とは
make関数は、スライス型のオブジェク
トを確保し、初期化する。
1番目の引数の型と同じ型を返す。
ポインタを返すわけではない。
func make([]T, len, cap) []T
- 27. (1)スライスの特徴
スライスのゼロ
初期化さてないスライスの値:nil
スライス==nilならば、
len,cap関数は0を返す
デモ slice_2.go
- 28. (1)スライスの特徴
re-slice
再スライス化可能
b := []byte{‘g’,’o’,’l’,’a’,‘n’,’g’}
c := b[1:4]
// c=[]byte{’o’,’l’,’a’}
// スライスcはスライスbと同じメモリ領域
デモ slice_2.go
- 31. (1)スライスの特徴
re-slice
b[1:4]
これら2つの数字は
省略可能
デモ slice_2.go
- 32. (1)スライスの特徴
re-slice
b[:]
b[:2]
b[2:]
デモ slice_2.go
- 33. (1)スライスの特徴
re-slice
b[:] ==b
b[:2]
b[2:]
デモ slice_2.go
- 34. (1)スライスの特徴
re-slice
b[:] ==b
b[:2] ==[]byte{‘g’,’o’}
b[2:]
デモ slice_2.go
- 35. (1)スライスの特徴
re-slice
b[:] ==b
b[:2] ==[]byte{‘g’,’o’}
b[2:] ==[]byte{‘l’,’a’,’n’,’g’}
デモ slice_2.go
- 36. (1)スライスの特徴
re-slice
自分のコードで、s[:len(s)]
と再スライスしてたよ、、、へへ。
デモ slice_2.go
- 38. (1)スライスの特徴
re-slice
配列からスライスを作る
x := [3]string{"Лайка", "Белка", "Стрелка"}
s := x[:] // スライスsはxの記憶領域を参照
デモ slice_2.go
- 46. (3)スライスを拡張する
copyとappend関数
容量(capacity)を増やすには、
1.新しく大きな容量のスライスを作成
2.その新しいスライスに元のスライスの
内容をコピーする
- 47. (3)スライスを拡張する
copyとappend関数
s := make([]byte, 5)
t := make([]byte, len(s),
(cap(s)+1)*2)
for i := range s {
t[i] = s[i]
}
s = t
デモ slice_4.go
- 48. (3)スライスを拡張する
copyとappend関数
s := make([]byte, 5)
t := make([]byte, len(s),
(cap(s)+1)*2)
for i := range s {
t[i] = s[i]
}
s = t
デモ slice_4.go
- 49. (3)スライスを拡張する
copyとappend関数
copy関数を使って次のように書ける
s := make([]byte, 5)
t := make([]byte, len(s),
(cap(s)+1)*2)
copy(t, s)
s = t
デモ slice_4.go
- 50. (3)スライスを拡張する
copyとappend関数
書式は下記の通り
func copy(dst, src []T) int
処理内容は、元のスライスから先のス
ライスにデータをコピーする
コピーした要素数を返す
- 51. (3)スライスを拡張する
copyとappend関数
copy関数は異なるlengthのスライス
でもコピーできる
var a = [...]int{0, 1, 2, 3,
4, 5, 6, 7}
var s = make([]int, 6)
n1 := copy(s, a[0:])
//n1=6, s=[]int{0,1,2,3,4,5}
デモ slice_4.go
- 52. (3)スライスを拡張する
copyとappend関数
スライスにデータを追加するには、
append関数を使用する
- 53. (3)スライスを拡張する
copyとappend関数
書式は下記の通り
func append(s []T, x ...T) []T
処理内容は、スライスsの最後に、
要素xを追加する
より大きな容量が必要なら(自動的に)拡張
してくれる
- 54. (3)スライスを拡張する
copyとappend関数
s3 := make([]int,1)
// s3 == []int{0}
// cap(s3) == 1
s3 = append(s3, 1, 2, 3)
// s3 == []int{0, 1, 2, 3}
// cap(s3) == 4
デモ slice_4.go
- 55. (3)スライスを拡張する
copyとappend関数
スライスにスライスを追加するには、
...を使用する
a := []string{“John”,”Paul”}
b := []string{"George",
"Ringo", "Pete"}
a = append(a, b...)
//a == []string{"John", "Paul",
"George", "Ringo", "Pete"}
デモ slice_4.go
- 59. (4)スライスから削除する
容量を削除するには、このdelete関数内で
再スライスした長さ分の スライスcを作り、
作ったスライスに再スライスしたsをコピーします。
func delete(i int, s []int) []int{
! s = append(s[:i], s[i+1:]...)
! c := make([]int, len(s))
! copy(c, s)
! return c
} デモ slice_5.go
Editor's Notes
- \n
- \n
- \n
- \n
- \n
- \n
- fmt.Printf(“aの型:%T¥n”, a) //aの型: int\n
- \n
- \n
- \n
- \n
- \n
- a[0]=1\ni := a[0]\ni = 2\nfmt.Println("i=",i) // i=2\nfmt.Println("a[0]=",a[0]) // a[0]=1\n\n
- a[0]=1\ni := a[0]\ni = 2\nfmt.Println("i=",i) // i=2\nfmt.Println("a[0]=",a[0]) // a[0]=1\n\n
- a[0]=1\ni := a[0]\ni = 2\nfmt.Println("i=",i) // i=2\nfmt.Println("a[0]=",a[0]) // a[0]=1\n\n
- a[0]=1\ni := a[0]\ni = 2\nfmt.Println("i=",i) // i=2\nfmt.Println("a[0]=",a[0]) // a[0]=1\n\n
- \n
- \n
- \n
- \n
- \n
- a[0]=1\ni := a[0]\ni = 2\nfmt.Println("i=",i) // i=2\nfmt.Println("a[0]=",a[0]) // a[0]=1\n\n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n