1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00
advanced-go-programming-book/images/ch2-x-slice-to-y-slice.plantuml
2018-02-18 04:14:52 +08:00

37 lines
892 B
Plaintext

' Copyright 2017 <chaishushan{AT}gmail.com>. All rights reserved.
' Use of this source code is governed by a Apache
' license that can be found in the LICENSE file.
'var p []X
'var q []Y // q = p
'pHdr := (*reflect.SliceHeader)(unsafe.Pointer(&p))
'qHdr := (*reflect.SliceHeader)(unsafe.Pointer(&q))
'pHdr.Data = qHdr.Data
'pHdr.Len = qHdr.Len * unsafe.Sizeof(q[0]) / unsafe.Sizeof(p[0])
'pHdr.Cap = qHdr.Cap * unsafe.Sizeof(q[0]) / unsafe.Sizeof(p[0])
@startuml
title []X <=> []Y
participant "var x []X\nvar y []Y" as slice
participant "var px *SliceHeader\nvar py *SliceHeader" as slice_header
== []X and []Y to *reflect.SliceHeader ==
slice -> slice_header: px := (*reflect.SliceHeader)(unsafe.Pointer(&x))\npy := (*reflect.SliceHeader)(unsafe.Pointer(&y))
== copy *px to *py ==
slice_header -> slice_header: ~*py = *px
== y changed by *py ==
slice -> slice: y = x
@enduml