Skip to content

Commit 1d5220f

Browse files
committed
ARROW-17584: [Go] Use unsafe.Slice from Go 1.17
1 parent 7475605 commit 1d5220f

8 files changed

+56
-359
lines changed

go/arrow/bitutil/bitutil.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,12 @@ const (
150150
)
151151

152152
func bytesToUint64(b []byte) []uint64 {
153-
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
154-
155-
var res []uint64
156-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
157-
s.Data = h.Data
158-
s.Len = h.Len / uint64SizeBytes
159-
s.Cap = h.Cap / uint64SizeBytes
153+
if cap(b) < uint64SizeBytes {
154+
return nil
155+
}
160156

161-
return res
157+
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
158+
return unsafe.Slice((*uint64)(unsafe.Pointer(h.Data)), cap(b)/uint64SizeBytes)[:len(b)/uint64SizeBytes]
162159
}
163160

164161
var (

go/arrow/type_traits_decimal128.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,26 +49,14 @@ func (decimal128Traits) PutValue(b []byte, v decimal128.Num) {
4949
func (decimal128Traits) CastFromBytes(b []byte) []decimal128.Num {
5050
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
5151

52-
var res []decimal128.Num
53-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
54-
s.Data = h.Data
55-
s.Len = h.Len / Decimal128SizeBytes
56-
s.Cap = h.Cap / Decimal128SizeBytes
57-
58-
return res
52+
return unsafe.Slice((*decimal128.Num)(unsafe.Pointer(h.Data)), cap(b)/Decimal128SizeBytes)[:len(b)/Decimal128SizeBytes]
5953
}
6054

6155
// CastToBytes reinterprets the slice b to a slice of bytes.
6256
func (decimal128Traits) CastToBytes(b []decimal128.Num) []byte {
6357
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
6458

65-
var res []byte
66-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
67-
s.Data = h.Data
68-
s.Len = h.Len * Decimal128SizeBytes
69-
s.Cap = h.Cap * Decimal128SizeBytes
70-
71-
return res
59+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*Decimal128SizeBytes)[:len(b)*Decimal128SizeBytes]
7260
}
7361

7462
// Copy copies src to dst.

go/arrow/type_traits_decimal256.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,13 @@ func (decimal256Traits) PutValue(b []byte, v decimal256.Num) {
4646
func (decimal256Traits) CastFromBytes(b []byte) []decimal256.Num {
4747
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
4848

49-
var res []decimal256.Num
50-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
51-
s.Data = h.Data
52-
s.Len = h.Len / Decimal256SizeBytes
53-
s.Cap = h.Cap / Decimal256SizeBytes
54-
55-
return res
49+
return unsafe.Slice((*decimal256.Num)(unsafe.Pointer(h.Data)), cap(b)/Decimal256SizeBytes)[:len(b)/Decimal256SizeBytes]
5650
}
5751

5852
func (decimal256Traits) CastToBytes(b []decimal256.Num) []byte {
5953
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
6054

61-
var res []byte
62-
s := (*reflect.SliceHeader)(unsafe.Pointer(&b))
63-
s.Data = h.Data
64-
s.Len = h.Len * Decimal256SizeBytes
65-
s.Cap = h.Cap * Decimal256SizeBytes
66-
67-
return res
55+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*Decimal256SizeBytes)[:len(b)*Decimal256SizeBytes]
6856
}
6957

7058
func (decimal256Traits) Copy(dst, src []decimal256.Num) { copy(dst, src) }

go/arrow/type_traits_float16.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import (
2020
"reflect"
2121
"unsafe"
2222

23-
"github.com/apache/arrow/go/v10/arrow/float16"
2423
"github.com/apache/arrow/go/v10/arrow/endian"
24+
"github.com/apache/arrow/go/v10/arrow/float16"
2525
)
2626

2727
// Float16 traits
@@ -48,26 +48,14 @@ func (float16Traits) PutValue(b []byte, v float16.Num) {
4848
func (float16Traits) CastFromBytes(b []byte) []float16.Num {
4949
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
5050

51-
var res []float16.Num
52-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
53-
s.Data = h.Data
54-
s.Len = h.Len / Float16SizeBytes
55-
s.Cap = h.Cap / Float16SizeBytes
56-
57-
return res
51+
return unsafe.Slice((*float16.Num)(unsafe.Pointer(h.Data)), cap(b)/Float16SizeBytes)[:len(b)/Float16SizeBytes]
5852
}
5953

6054
// CastToBytes reinterprets the slice b to a slice of bytes.
6155
func (float16Traits) CastToBytes(b []float16.Num) []byte {
6256
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
6357

64-
var res []byte
65-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
66-
s.Data = h.Data
67-
s.Len = h.Len * Float16SizeBytes
68-
s.Cap = h.Cap * Float16SizeBytes
69-
70-
return res
58+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*Float16SizeBytes)[:len(b)*Float16SizeBytes]
7159
}
7260

7361
// Copy copies src to dst.

go/arrow/type_traits_interval.go

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,14 @@ func (monthTraits) PutValue(b []byte, v MonthInterval) {
5959
func (monthTraits) CastFromBytes(b []byte) []MonthInterval {
6060
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
6161

62-
var res []MonthInterval
63-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
64-
s.Data = h.Data
65-
s.Len = h.Len / MonthIntervalSizeBytes
66-
s.Cap = h.Cap / MonthIntervalSizeBytes
67-
68-
return res
62+
return unsafe.Slice((*MonthInterval)(unsafe.Pointer(h.Data)), cap(b)/MonthIntervalSizeBytes)[:len(b)/MonthIntervalSizeBytes]
6963
}
7064

7165
// CastToBytes reinterprets the slice b to a slice of bytes.
7266
func (monthTraits) CastToBytes(b []MonthInterval) []byte {
7367
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
7468

75-
var res []byte
76-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
77-
s.Data = h.Data
78-
s.Len = h.Len * MonthIntervalSizeBytes
79-
s.Cap = h.Cap * MonthIntervalSizeBytes
80-
81-
return res
69+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*MonthIntervalSizeBytes)[:len(b)*MonthIntervalSizeBytes]
8270
}
8371

8472
// Copy copies src to dst.
@@ -108,26 +96,14 @@ func (daytimeTraits) PutValue(b []byte, v DayTimeInterval) {
10896
func (daytimeTraits) CastFromBytes(b []byte) []DayTimeInterval {
10997
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
11098

111-
var res []DayTimeInterval
112-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
113-
s.Data = h.Data
114-
s.Len = h.Len / DayTimeIntervalSizeBytes
115-
s.Cap = h.Cap / DayTimeIntervalSizeBytes
116-
117-
return res
99+
return unsafe.Slice((*DayTimeInterval)(unsafe.Pointer(h.Data)), cap(b)/DayTimeIntervalSizeBytes)[:len(b)/DayTimeIntervalSizeBytes]
118100
}
119101

120102
// CastToBytes reinterprets the slice b to a slice of bytes.
121103
func (daytimeTraits) CastToBytes(b []DayTimeInterval) []byte {
122104
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
123105

124-
var res []byte
125-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
126-
s.Data = h.Data
127-
s.Len = h.Len * DayTimeIntervalSizeBytes
128-
s.Cap = h.Cap * DayTimeIntervalSizeBytes
129-
130-
return res
106+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*DayTimeIntervalSizeBytes)[:len(b)*DayTimeIntervalSizeBytes]
131107
}
132108

133109
// Copy copies src to dst.
@@ -158,26 +134,14 @@ func (monthDayNanoTraits) PutValue(b []byte, v MonthDayNanoInterval) {
158134
func (monthDayNanoTraits) CastFromBytes(b []byte) []MonthDayNanoInterval {
159135
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
160136

161-
var res []MonthDayNanoInterval
162-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
163-
s.Data = h.Data
164-
s.Len = h.Len / MonthDayNanoIntervalSizeBytes
165-
s.Cap = h.Cap / MonthDayNanoIntervalSizeBytes
166-
167-
return res
137+
return unsafe.Slice((*MonthDayNanoInterval)(unsafe.Pointer(h.Data)), cap(b)/MonthDayNanoIntervalSizeBytes)[:len(b)/MonthDayNanoIntervalSizeBytes]
168138
}
169139

170140
// CastToBytes reinterprets the slice b to a slice of bytes.
171141
func (monthDayNanoTraits) CastToBytes(b []MonthDayNanoInterval) []byte {
172142
h := (*reflect.SliceHeader)(unsafe.Pointer(&b))
173143

174-
var res []byte
175-
s := (*reflect.SliceHeader)(unsafe.Pointer(&res))
176-
s.Data = h.Data
177-
s.Len = h.Len * MonthDayNanoIntervalSizeBytes
178-
s.Cap = h.Cap * MonthDayNanoIntervalSizeBytes
179-
180-
return res
144+
return unsafe.Slice((*byte)(unsafe.Pointer(h.Data)), cap(b)*MonthDayNanoIntervalSizeBytes)[:len(b)*MonthDayNanoIntervalSizeBytes]
181145
}
182146

183147
// Copy copies src to dst.

0 commit comments

Comments
 (0)