mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 12:32:21 +00:00
46 lines
1.0 KiB
Go
46 lines
1.0 KiB
Go
// Copyright © 2017 ChaiShushan <chaishushan{AT}gmail.com>.
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
package main
|
|
|
|
//#include "./person_capi.h"
|
|
import "C"
|
|
import "unsafe"
|
|
|
|
//export person_new
|
|
func person_new(name *C.char, age C.int) C.person_handle_t {
|
|
id := NewObjectId(NewPerson(C.GoString(name), int(age)))
|
|
return C.person_handle_t(id)
|
|
}
|
|
|
|
//export person_delete
|
|
func person_delete(h C.person_handle_t) {
|
|
ObjectId(h).Free()
|
|
}
|
|
|
|
//export person_set
|
|
func person_set(h C.person_handle_t, name *C.char, age C.int) {
|
|
p := ObjectId(h).Get().(*Person)
|
|
p.Set(C.GoString(name), int(age))
|
|
}
|
|
|
|
//export person_get_name
|
|
func person_get_name(h C.person_handle_t, buf *C.char, size C.int) *C.char {
|
|
p := ObjectId(h).Get().(*Person)
|
|
name, _ := p.Get()
|
|
|
|
n := int(size) - 1
|
|
bufSlice := ((*[1 << 31]byte)(unsafe.Pointer(buf)))[0:n:n]
|
|
n = copy(bufSlice, []byte(name))
|
|
bufSlice[n] = 0
|
|
|
|
return buf
|
|
}
|
|
|
|
//export person_get_age
|
|
func person_get_age(h C.person_handle_t) C.int {
|
|
p := ObjectId(h).Get().(*Person)
|
|
_, age := p.Get()
|
|
return C.int(age)
|
|
}
|