为什么这不起作用?
package main
import "fmt"
type name struct {
X string
}
func main() {
var a [3]name
a[0] = name{"Abbed"}
a[1] = name{"Ahmad"}
a[2] = name{"Ghassan"}
nameReader(a)
}
func nameReader(array []name) {
for i := 0; i < len(array); i++ {
fmt.Println(array[i].X)
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
.\structtest.go:15: cannot use a (type [3]name) as type []name in function argument
Run Code Online (Sandbox Code Playgroud) 来自文档
func (v Value) Elem() Value
Run Code Online (Sandbox Code Playgroud)
Elem返回接口v包含的值或指针v指向的值.如果v的种类不是接口或Ptr,它会引起恐慌.如果v为nil,则返回零值.
func Indirect(v Value) Value
Run Code Online (Sandbox Code Playgroud)
间接返回v指向的值.如果v是nil指针,则Indirect返回零值.如果v不是指针,则间接返回v.
那么我可以安全地假设以下内容吗?
reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().
Run Code Online (Sandbox Code Playgroud)
间接方法只是上述右侧的便捷方法吗?
我正在设计一个包,我希望根据观察者模式提供一个API:也就是说,有些点我想发出一个信号,触发零个或多个感兴趣的各方.那些感兴趣的人不一定需要了解彼此.
我知道我可以从头开始实现这样的API(例如使用一组通道或回调函数),但是想知道是否有一种构建这种API的首选方法.
在我使用过的许多语言或框架中,有一些标准方法可以构建这些API,使它们按照用户期望的方式运行:例如g_signal_*基于glib的应用程序,事件和addEventListener()JavaScript DOM应用程序的功能,或者用于多播代理的多播代理.净.
Go有什么类似的吗?如果没有,是否有其他方法可以构建这种类型的API,这在Go中更为惯用?
我知道我可以使用select {}Go中的语法在多个通道上等待,并使用syscall.Select()或类似的函数等待多个文件描述符.但是有可能一次在两个频道上等待吗?
对于后台,我希望有一个goroutine接受通过通道的消息并通过套接字连接(由gozmq提供)转发它们,同时等待套接字连接上的回复.
由于底层库的线程安全要求,套接字一次只能在一个线程中访问,这就是为什么我想知道是否有办法从单个goroutine处理这个问题.
我在linux/amd64盒子上编译了以下Go程序:
package main
import (
"fmt"
"os/user"
)
func main() {
fmt.Println(user.Current())
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是当我从Mac框交叉编译它时,我在我的linux盒子上运行该程序时出现以下错误:
user: Current not implemented on linux/amd64
如何交叉编译并使用包中的Current函数os/user?
编辑1:我应该补充一点,这些是我用来在Mac机上设置交叉编译的说明:https://code.google.com/p/go-wiki/wiki/WindowsCrossCompiling
编辑2:交叉编译windows/386工作正常.
type Human struct {
Name string
}
func (t *Human) GetInfo() {
fmt.Println(t.Name)
}
func main() {
var p1 interface{}
p1 = Human{Name:"John"}
//p1.GetInfo()
}
Run Code Online (Sandbox Code Playgroud)
现在,p1的典型是接口{},但我想得到一个Human对象.
怎么做?我可以调用p1.GetInfo()
这是学习的最让我困惑的地方.我们都知道方法T只影响副本T,而方法*T会影响实际数据T.
为什么方法T也可以使用*T,但不允许相反?所以,你可以给我为什么他们不允许对方法的示例(或原因)*T被使用T?
这个设计的优点和缺点是什么?
我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号。说我的头文件看起来像这样:
int a();
int a(int);
class B {
B(){}
~B(){}
int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );
Run Code Online (Sandbox Code Playgroud)
我想隐藏所有未在头文件中说明的内容。
版本脚本的外观如何?
当使用CGo将C代码与Go连接时,如果我在C端保留对Go变量的引用,那么我是否会冒被垃圾收集器释放该对象的风险,或者GC会看到由所管理的变量中的指针C方面?
为了说明我的要求,请考虑以下示例程序:
去代码:
package main
/*
typedef struct _Foo Foo;
Foo *foo_new(void);
void foo_send(Foo *foo, int x);
int foo_recv(Foo *foo);
*/
import "C"
//export makeChannel
func makeChannel() chan int {
return make(chan int, 1)
}
//export sendInt
func sendInt(ch chan int, x int) {
ch <- x
}
//export recvInt
func recvInt(ch chan int) int {
return <-ch
}
func main() {
foo := C.foo_new()
C.foo_send(foo, 42)
println(C.foo_recv(foo))
}
Run Code Online (Sandbox Code Playgroud)
C代码:
#include <stdlib.h>
#include "_cgo_export.h"
struct _Foo {
GoChan ch;
}; …Run Code Online (Sandbox Code Playgroud) 我正在编写一个例程来遍历目录树并为我找到的每个文件创建数字签名(加盐哈希)。在测试它时,我得到了这种奇怪的行为 - 如果我给程序一个目录“上方”的根路径,程序可以遍历树并打印出文件名,但是如果我尝试打开文件以读取它的字节,我在例程找到的文件上收到错误消息“没有这样的文件或目录” - 不确定这里给出了什么。Walk() 例程如何“看到”该文件,但 ioutil.ReadFile() 却找不到它?
示例代码:
// start with path higher up the tree, say $HOME
func doHashWalk(dirPath string) {
err := filepath.Walk(dirPath, walkFn)
// Check err here
}
func walkFn(path string, fi os.FileInfo, err error) (e error) {
if !fi.IsDir() {
// if the first character is a ".", then skip it as it's a hidden file
if strings.HasPrefix(fi.Name(), ".") {
return nil
}
// read in the file bytes -> get the absolute path
fullPath, …Run Code Online (Sandbox Code Playgroud)