2013-06-04 39 views
6

Khi lấy chuỗi con của chuỗi trong Go, không có bộ nhớ mới nào được cấp phát. Thay vào đó, biểu diễn bên dưới của chuỗi con chứa một con trỏ Dữ liệu là một bù đắp của con trỏ Dữ liệu của chuỗi ban đầu. Điều này có nghĩa là nếu tôi có một chuỗi lớn và muốn theo dõi một chuỗi con nhỏ, bộ thu gom rác sẽ không thể giải phóng bất kỳ chuỗi lớn nào cho đến khi tôi giải phóng tất cả các tham chiếu đến chuỗi con ngắn hơn.đế và bộ thu gom rác Đi

Lát có vấn đề tương tự, nhưng bạn có thể giải quyết vấn đề bằng cách tạo bản sao của subslice bằng cách sử dụng copy(). Tôi không biết về bất kỳ hoạt động sao chép tương tự nào cho chuỗi. Cách thành ngữ và nhanh nhất để tạo "bản sao" của chuỗi con là gì?

+1

Đây là loại một thiếu sót của Go. Có thể sử dụng make (string, foo [x: y]) cho việc này. – fuz

Trả lời

1

Ví dụ,

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))) 
} 

Output:

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

Giải pháp này không tạo ra hai bản sao của chuỗi con được tạo ra? Một cho chuyển đổi thành [] byte, và một cho chuyển đổi trở lại chuỗi? – Beevik

+1

Có, thật không may. Tuy nhiên, lát byte là tạm thời. – peterSO