小编Eth*_*han的帖子

Golang:我可以转换为chan接口{}

我正在尝试为订阅编写一个通用的包装器,例如:

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并触发通用通道上发生的任何事情,但我并不特别喜欢为了绕过类型转换而引入另一个通道.

casting interface channel go publish-subscribe

11
推荐指数
1
解决办法
7496
查看次数

PIL在保存时更改像素值

这很简单.制作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)

例如.

为什么保存时价值会发生变化?我该如何预防呢?请帮忙.

谢谢.

python image save python-imaging-library

6
推荐指数
2
解决办法
4123
查看次数

为什么我不能在golang中为我的库添加一个main?

我无法实现应该是一项简单的任务.我理解代码组织的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/mylibpkg/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!

program-entry-point code-organization package go

4
推荐指数
1
解决办法
1455
查看次数

golang匿名字段的类型映射

我以为我可以使用匿名字段制作有序的地图类型:

type customMap struct{
    map[string]string
    ordered []string
}
Run Code Online (Sandbox Code Playgroud)

我可以在哪里引用地图customMapInstance["key"]并迭代ordered.唉,似乎数组和地图不是有效的匿名字段.我怀疑这是有充分理由的......

struct map anonymous-class go

4
推荐指数
1
解决办法
2534
查看次数

在cuda上使用python句柄分配内存和ctypes

我试图通过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)

c python ctypes cuda void-pointers

1
推荐指数
1
解决办法
883
查看次数

Golang正则表达式无法匹配字节10

请尝试以下方法:

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提供了[]字节函数,所以这是一种疏忽.

regex byte newline go

1
推荐指数
1
解决办法
436
查看次数