2020年1月30日木曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 4(コレクション)、LESSON 18(もっと大きなスライス)の練習問題の解答を求めてみる。

コード

package main

import "fmt"

func main() {
 elem := "要素"
 slice := []string{}
 capacity := cap(slice)
 fmt.Printf("容量: %v\n", capacity)
 for i := 0; i < 10000; i++ {
  slice = append(slice, elem)
  if cap(slice) > capacity {
   capacity = cap(slice)
   fmt.Printf("容量: %v\n", capacity)
  }
 }
}

入出力結果(Zsh、PowerShell、Terminal)

% go run ./capacity.go
容量: 0
容量: 1
容量: 2
容量: 4
容量: 8
容量: 16
容量: 32
容量: 64
容量: 128
容量: 256
容量: 512
容量: 1024
容量: 1280
容量: 1704
容量: 2560
容量: 3584
容量: 4608
容量: 6144
容量: 7680
容量: 9728
容量: 12288
%

append関数は途中までスライスの容量(基底配列の長さ)を2倍にするけど、途中からは2倍になっていない。メモリー容量、効率性を重視してそういう実装か言語仕様になってるのかも。

0 コメント:

コメントを投稿