golang/go

go/build: does not support examples that use cgo

オープン

#20,381 opened on 2017/05/16

 (4 件のコメント) (0 件のリアクション) (0 人の担当者)Go (19,008 件のフォーク)batch import
NeedsInvestigationhelp wanted

Repository metrics

Stars
 (133,883 個のスター)
PR merge metrics
 (30d に merged PR はありません)

説明

While prototyping a library to work around #13656, I ran in to a pretty major issue with the godoc tool. It doesn't generate any documentation at all for packages whose tests use cgo, which implies that packages designed for use with cgo cannot contain idiomatic examples.

bcmills:~/src$ go version
go version devel +b53acd89db Tue May 16 17:15:11 2017 +0000 linux/amd64
bcmills:~/src$ go tool doc cslice
doc: use of cgo in test /usr/local/google/home/bcmills/src/cslice/cslice_test.go not supported

cslice/cslice_test.go:

package cslice_test

/*
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
*/
import "C"

import (
	"fmt"
	"reflect"
	"testing"
	"unsafe"

	"cslice"
)

func ExampleSetAt() {
	var (
		original *C.char  = C.CString("Hello, world!")
		sz       C.size_t = C.strlen(original)
	)
	defer C.free(unsafe.Pointer(original))

	var alias []byte
	cslice.SetAt(&alias, unsafe.Pointer(original), int(sz))

	fmt.Println("original:", C.GoString(original))
	fmt.Println("alias:", string(alias))
	copy(alias, "Adios")
	fmt.Println("original:", C.GoString(original))
	fmt.Println("alias:", string(alias))

	// Output:
	// original: Hello, world!
	// alias: Hello, world!
	// original: Adios, world!
	// alias: Adios, world!
}

func ExampleReflectAt() {
	var (
		original *C.char  = C.CString("Hello, world!")
		sz       C.size_t = C.strlen(original)
	)
	defer C.free(unsafe.Pointer(original))

	alias := cslice.ReflectAt(reflect.TypeOf(byte(0)), unsafe.Pointer(original), int(sz))

	fmt.Println("original:", C.GoString(original))
	fmt.Println("alias:", string(alias.Bytes()))
	reflect.Copy(alias, reflect.ValueOf([]byte("Adios")))
	fmt.Println("original:", C.GoString(original))
	fmt.Println("alias:", string(alias.Bytes()))

	// Output:
	// original: Hello, world!
	// alias: Hello, world!
	// original: Adios, world!
	// alias: Adios, world!
}

コントリビューターガイド