Исходники и презентации
This commit is contained in:
63
lessons/strings/cow_string/main.go
Normal file
63
lessons/strings/cow_string/main.go
Normal file
@ -0,0 +1,63 @@
|
||||
package main
|
||||
|
||||
// Copy-On-Write
|
||||
type COWString struct {
|
||||
data []byte
|
||||
refs *int
|
||||
}
|
||||
|
||||
func NewString(values ...byte) COWString {
|
||||
return COWString{
|
||||
data: values,
|
||||
refs: new(int),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *COWString) Length() int {
|
||||
return len(s.data)
|
||||
}
|
||||
|
||||
func (s *COWString) Capacity() int {
|
||||
return cap(s.data)
|
||||
}
|
||||
|
||||
func (s *COWString) ToString() string {
|
||||
return string(s.data) // copying...
|
||||
}
|
||||
|
||||
func (s *COWString) Get(idx int) byte {
|
||||
// without bound checking
|
||||
return s.data[idx]
|
||||
}
|
||||
|
||||
func (s *COWString) Set(idx int, value byte) {
|
||||
// without bound checking
|
||||
|
||||
if *s.refs > 0 {
|
||||
s.data = append([]byte(nil), s.data...)
|
||||
}
|
||||
|
||||
s.data[idx] = value
|
||||
}
|
||||
|
||||
func (s *COWString) Copy() COWString {
|
||||
(*s.refs)++
|
||||
return COWString{
|
||||
data: s.data,
|
||||
refs: s.refs,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *COWString) Append(values ...byte) {
|
||||
if *s.refs > 0 {
|
||||
s.data = append([]byte(nil), s.data...)
|
||||
}
|
||||
|
||||
s.data = append(s.data, values...)
|
||||
}
|
||||
|
||||
func main() {
|
||||
str := NewString([]byte("Hello world")...)
|
||||
temp := str
|
||||
_ = temp
|
||||
}
|
||||
Reference in New Issue
Block a user