2013-06-04 13 views
6

Goで文字列の部分文字列を取り出すと、新しいメモリは割り当てられません。代わりに、部分文字列の基礎となる表現には、元の文字列のデータポインタのオフセットであるデータポインタが含まれています。部分文字列とGoガベージコレクタ

これは、大きな文字列を持ち、小さな部分文字列を追跡したい場合、短い部分文字列へのすべての参照を解放するまで、ガベージコレクタは大きな文字列を解放できないことを意味します。

スライスにも同様の問題がありますが、copy()を使用してサブスライスのコピーを作成することで回避できます。私は文字列の類似したコピー操作を知らない。サブストリングの「コピー」を作成するための慣用的で最速の方法は何ですか?例えば

+1

これは行くの欠点の一種です。これにはmake(string、foo [x:y])を使うことができるはずです。 – fuz

答えて

1

package main 

import (
    "fmt" 
    "unsafe" 
) 

type String struct { 
    str *byte 
    len int 
} 

func main() { 
    str := "abc" 
    substr := string([]byte(str[1:])) 
    fmt.Println(str, substr) 
    fmt.Println(*(*String)(unsafe.Pointer(&str)), *(*String)(unsafe.Pointer(&substr))) 
} 

出力:

abc bc 
{0x4c0640 3} {0xc21000c940 2} 
+1

このソリューションでは、部分文字列のコピーが2つ作成されませんか? []バイトへの変換のためのものと、文字列への変換へのもう一つのもの? – Beevik

+1

はい、残念ながら。ただし、バイトスライスは一時的なものです。 – peterSO

関連する問題