ज्ञात के रूप में, कोई यूनियन प्रकार नहीं है, और केवल इंटरफ़ेस के माध्यम से अनुकरण किया जाना चाहिए।गोलांग: यूनियन प्रकार को कुशलतापूर्वक अनुकरण कैसे करें
मैं दो तरीकों की कोशिश संघ अनुकरण करने के लिए है, लेकिन परिणाम सी के रूप में अच्छा से दूर है
package main
import (
"fmt"
"time"
)
type U interface {
i32() int32
i16() int16
}
type i32 int32
func (u i32) i32() int32 {
return int32(u)
}
func (u i32) i16() int16 {
return int16(u)
}
type i16 int16
func (u i16) i32() int32 {
return int32(u)
}
func (u i16) i16() int16 {
return int16(u)
}
func test() (total int64) {
type A struct {
t int32
u interface{}
}
a := [...]A{{1, int32(100)}, {2, int16(3)}}
for i := 0; i < 5000000000; i++ {
p := &a[i%2]
switch p.t {
case 1:
total += int64(p.u.(int32))
case 2:
total += int64(p.u.(int16))
}
}
return
}
func test2() (total int64) {
type A struct {
t int32
u U
}
a := [...]A{{1, i32(100)}, {2, i16(3)}}
for i := 0; i < 5000000000; i++ {
p := &a[i%2]
switch p.t {
case 1:
total += int64(p.u.i32())
case 2:
total += int64(p.u.i16())
}
}
return
}
type testfn func() int64
func run(f testfn) {
ts := time.Now()
total := f()
te := time.Now()
fmt.Println(total)
fmt.Println(te.Sub(ts))
}
func main() {
run(test)
run(test2)
}
परिणाम:
257500000000
1m23.508223094s
257500000000
34.95081661s
विधि जिस तरह से बेहतर है, और टाइप-कास्ट रास्ता अधिक CPU समय लागत।
सी संस्करण:
#include <stdio.h>
struct A {
int t;
union {
int i;
short v;
} u;
};
long test()
{
struct A a[2];
a[0].t = 1;
a[0].u.i = 100;
a[1].t = 2;
a[1].u.v = 3;
long total = 0;
long i;
for (i = 0; i < 5000000000; i++) {
struct A* p = &a[i % 2];
switch(p->t) {
case 1:
total += p->u.i;
break;
case 2:
total += p->u.v;
break;
}
}
return total;
}
int main()
{
long total = test();
printf("%ld\n", total);
}
परिणाम:
257500000000
real 0m5.620s
user 0m5.620s
sys 0m0.000s
संघ प्रकार कई अनुप्रयोगों, जैसे के लिए उपयोगी है नेटवर्क प्रोटोकॉल में वेरिएंट कंक्रीट प्रकार हो सकता है। तो शायद यूनियन डेटा की पहुंच एप्लिकेशन की बाधा बन सकती है।
कोई भी मदद कर सकता है? धन्यवाद।
हां, यह प्रदर्शन में सुधार कर सकता है, लेकिन कभी-कभी संस्करण प्रकार में अन्य प्रकार शामिल हो सकते हैं, उदा। स्ट्रिंग या बाइट सरणी। – kingluo
संपादित देखें। मैंने 'असुरक्षित' के उपयोग हटा दिए हैं क्योंकि इसकी वास्तव में आवश्यकता नहीं है और अन्य प्रकारों के बारे में एक नोट जोड़ा गया है। –
धन्यवाद। मैं द्विआधारी कार्यों का प्रयास करता हूं, वे बहुत महंगे लगते हैं। चूंकि संघ तार प्रारूप होने का इरादा नहीं रखता है, इसलिए संख्यात्मक प्रकारों के लिए बाइनरी प्रतिनिधित्व आवश्यक नहीं है। मुझे लगता है कि असुरक्षित मेरे मामले में और अधिक समझ में आता है। – kingluo