
假设我有一个带签名的 C 函数
// myclib.h void modify(double* ptr, int N);
这会改变参数指针 ptr 指向的内存。
【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键
以下代码对于 Go 的垃圾收集器来说是否安全?是否需要 runtimer.Pinner?
package main
// #cgo CFLAGS: -g -Wall
// #include "myclib.h"
import "C"
import (
"fmt"
"runtime"
)
func modifyWrapper(v []float64) {
ptr := (*C.double)(&v[0])
N := (C.int)(len(v))
pinner := runtime.Pinner{}
pinner.Pin(ptr)
C.modify(ptr, N)
pinner.Unpin()
}
func main() {
v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
modifyWrapper(v)
}
正确答案
package main /* #cgo CFLAGS: -g -Wall #includevoid modify(double* ptr, int N) { if (!ptr || N <= 0) { return; } printf("modify: %g %d\n", *ptr, N); *ptr = 42; printf("modify: %g %d\n", *ptr, N); } */ import "C" import ( "fmt" "unsafe" ) func modify(v []float64) { ptr := (*C.double)(unsafe.SliceData(v)) N := (C.int)(len(v)) C.modify(ptr, N) } func main() { v := []float64{9.0, 2.0, 1.0, 4.0, 5.0} fmt.Println(v) modify(v) fmt.Println(v) }
[9 2 1 4 5] modify: 9 5 modify: 42 5 [42 2 1 4 5]









