package main
import (
"fmt"
)
var (
opCodes []func(t *Test) int8
)
func init() {
opCodes = make([]func(t *Test) int8, 2)
opCodes[0] = func(t *Test) int8 {
return t.a + t.b
}
opCodes[1] = func(t *Test) int8 {
return t.a - t.b
}
}
type Test struct {
a int8
b int8
}
func (t *Test) Call(fnID int) int8 {
return opCodes[fnID](t)
}
func main() {
t := Test{
a: 2,
b: 5,
}
fmt.Println(t.Call(0x00), t.Call(0x01))
}
go generate
можно так:package main
import (
"fmt"
)
var (
opCodes []func(t *Test) int8
)
type Test struct {
a int8
b int8
}
func (t *Test) Add() int8 {
return t.a + t.b
}
func (t *Test) Sub() int8 {
return t.a - t.b
}
func (t *Test) Call(fnID int) int8 {
return opCodes[fnID](t)
}
func main() {
t := Test{
a: 2,
b: 5,
}
fmt.Println(t.Call(0x00), t.Call(0x01))
}
package main
func init() {
opCodes = make([]func(t *Test) int8, 2)
opCodes[0] = func(t *Test) int8 {
return t.Add()
}
opCodes[1] = func(t *Test) int8 {
return t.Sub()
}
}
go generate
и парснига кода структуры генерировать в отдельном файле метод fillOpCodes()
, который будет вызываться из метода Init
структуры. cipher, _ := blowfish.NewCipher(key)
size := blowfish.BlockSize
for bs, be := 0, size; bs < len(encryptedText); bs, be = bs+size, be+size {
cipher.Decrypt(encryptedText[bs:be], encryptedText[bs:be])
}
fmt.Println(string(encryptedText))
}
// Decrypt decrypts the 8-byte buffer src using the key k
// and stores the result in dst.
func (c *Cipher) Decrypt(dst, src []byte) {
l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
l, r = decryptBlock(l, r, c)
dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l)
dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r)
}
The cause is that go build is using too much memory, you have to upgrade your memory to 3GB+ to avoid go build process run out of memory.