我正在尝试为订阅编写一个通用的包装器,例如:
type Subscriber interface{
Subscribe(addr string) chan interface{}
}
Run Code Online (Sandbox Code Playgroud)
假设有一个我想要使用的库,其中有一个订阅方法,但它使用了一个chan library.Object.我希望能够做到这样的事情:
func (s *mySubscriber) Subscribe(addr string) chan interface{}{
ch := make(chan library.Object)
library.Subscribe(addr, ch)
return chan interface{}(ch)
}
Run Code Online (Sandbox Code Playgroud)
目前,我不相信这样的演员是可能的.我不想修改底层库,因为包装器应该与库实现无关.
我已经看到有没有办法将Structs转换为通过通道发送,但在这种情况下,可以修改应用程序以满足需要.在这里,它不能.这可能吗?有没有更好的办法?
一种解决方案是将一个通用通道传递给Subscribe,并且无限制地等待chan library.Object并触发通用通道上发生的任何事情,但我并不特别喜欢为了绕过类型转换而引入另一个通道.
这很简单.制作RGB图像,一个像素大.将像素值设置为(a,b,c).保存.问题是,保存的图像具有与(a,b,c)不同的像素值.通常,在其中一个通道上使用+ -1,就好像它是随机噪声,但它的一致性.下面是代码:
from PIL import Image
newImg = Image.new('RGB', (1,1), "black")
pixels = newImg.load()
pixels[0,0] = (0,3,0)
newImg.save("point.jpg")
savedImage = Image.open("point.jpg")
pixelsSaved = savedImage.load()
print pixels[0,0]
print pixelsSaved[0,0]
Run Code Online (Sandbox Code Playgroud)
这个输出是:(0,3,0)(1,3,0)
一致.
如果我使用(4,2,0)作为要保存的像素,则输出为:(4,2,0)(3,2,0)
和(0,10,0)给出:(0,10,0)(0,10,1)
例如.
为什么保存时价值会发生变化?我该如何预防呢?请帮忙.
谢谢.
我无法实现应该是一项简单的任务.我理解代码组织的GitHub模型(即库存仓库和使用库的应用程序仓库).我觉得这很棒.但我经常发现我想mylib在一个main.go文件中捆绑一个简单的可执行文件.本main.go应该是package main和应导入mylib.换句话说,它应该是如何构建使用此库的应用程序的确切文档.
我的观点是,因为提供一个包装你的库的简单命令行界面通常足够方便,所以应该有一个简单的方法来做到这一点,而不必再做一个回购,golang应该有所帮助.
我喜欢以下内容:
$GOPATH/src/github.com/me/mylib
mylib.go
mylib_also.go
main.go
Run Code Online (Sandbox Code Playgroud)
在哪里mylib是library(package mylib)并且main.go正在package main运行go install它生成bin/mylib和pkg/mylib.a.
无论是main.go应导入"github.com/me/mylib"(如果我这样做,现在,我得到循环导入错误),或go会明白发生了什么,因为这个功能应该建立在和一个main.go在回购产生EXEC.可能需要导入(并且丢弃周期性错误)是更好的方法.
现在,我必须这样做
$GOPATH/src/github.com/me/mylib
mylib/
mylib.go
main.go
Run Code Online (Sandbox Code Playgroud)
所以我必须导入github.com/me/mylib/mylib这很荒谬.
总之,go install应该允许包的特殊情况和导入包的main,并提供演示包API的简单cli.GitHub模型促进了两个回购,但它应该很容易在一个简单的clis!
我以为我可以使用匿名字段制作有序的地图类型:
type customMap struct{
map[string]string
ordered []string
}
Run Code Online (Sandbox Code Playgroud)
我可以在哪里引用地图customMapInstance["key"]并迭代ordered.唉,似乎数组和地图不是有效的匿名字段.我怀疑这是有充分理由的......
我试图通过ctypes使用python来控制cuda.在这里,为了说明我的问题,我使用python将指针传递给c函数,这些函数分配cuda内存,将numpy数组复制到cuda mempory,并将cuda内存复制回新的numpy数组.但它似乎没有用,尽管我的基本ctypes设置工作.我认为问题在于从cudaMalloc函数返回到python的内容.
这是python代码
pycu_alloc = dll.alloc_gpu_mem
pycu_alloc.argtypes = [c_size_t]
pycu_alloc.restypes = [c_void_p]
host2gpu = dll.host2gpu
host2gpu.argtypes = [c_void_p, c_void_p, c_size_t]
gpu2host = dll.gpu2host
gpu2host.argtypes = [c_void_p, c_void_p, c_size_t]
a = np.random.randn(1024).astype('float32')
c = np.zeros(1024).astype('float32')
c_a = c_void_p(a.ctypes.data)
c_c = c_void_p(c.ctypes.data)
da = pycu_alloc(1024)
c_da = c_void_p(da)
host2gpu(c_a, c_da, 1024)
gpu2host(c_c, c_da, 1024)
print a
print c
Run Code Online (Sandbox Code Playgroud)
和C:
extern "C" {
float * alloc_gpu_mem( size_t N)
{
float *d;
int size = N *sizeof(float);
int err;
err = cudaMalloc(&d, size);
printf("cuda …Run Code Online (Sandbox Code Playgroud) 请尝试以下方法:
func main(){
r := regexp.MustCompile(`(.)`)
for i := 0; i < 255; i++{
d := []byte{byte(i)}
all := r.FindAll(d, -1)
fmt.Println(all)
}
}
Run Code Online (Sandbox Code Playgroud)
通配符不能匹配字节10(即新行字符).看起来像个bug.我认为正则表达式从来没有真正用于[]字节,但golang提供了[]字节函数,所以这是一种疏忽.