我正在通过为GAE编写应用程序来学习Go,这是处理函数的签名:
func handle(w http.ResponseWriter, r *http.Request) {}
Run Code Online (Sandbox Code Playgroud)
我是指针新手,所以为什么Request对象是一个指针,但ResponseWriter不是?有没有必要这样做或者这只是为了使某种基于高级指针的代码成为可能?
我有以下代码:
package main
type MyInterface interface {
Test()
}
type MyType struct {
}
func (m MyType) Test(){}
func AcceptInterface(i *MyInterface){
}
func main() {
object := &MyType{}
AcceptInterface(object)
}
Run Code Online (Sandbox Code Playgroud)
我期待这个工作,因为MyType实现了MyInterface,但我得到:
不能在AcceptInterface的参数中使用对象(类型*MyType)作为类型*MyInterface:*MyInterface是指向接口的指针,而不是接口
我尝试做类型断言:对象.(MyInterface),但这也不起作用.
我怎么能做到这一点?
唯一让我感到不适的是语法。看下面的例子:
package main
import "fmt"
type Interface interface {
String() string
}
type Implementation int
func (v Implementation) String() string {
return fmt.Sprintf("Hello %d", v)
}
func main() {
var i Interface
impl := Implementation(42)
i = impl
fmt.Println(i.String())
}
Run Code Online (Sandbox Code Playgroud)
我的问题是i = impl。基于一个接口实例实际上拥有一个指向实际数据的指针引用这一事实,对我来说,这样做会更加自然i = &impl。通常,在不使用时分配非指针&将创建数据的完整内存副本,但是在分配给接口时,这似乎可以避免这种情况,而只是(在幕后)将指针分配给接口值。我对吗?也就是说,用于的数据int(42)会不会复制到内存中?
最近有人问我一个问题,Golang 和 Java 在interface 上有什么区别?
我知道存在一些“语法糖级别”差异,我感兴趣的是地下的任何东西,比如 Golang 和 Java 是如何实现接口的?最大的区别是什么?哪一种更有效率?为什么?
任何人都可以发布有关此主题的博客链接或源代码吗?源代码更好。
谢谢。
我想表达一个可以采取任何切片的函数.我以为我可以这样做:
func myFunc(list []interface{}) {
for _, i := range list {
...
some_other_fun(i)
...
}
}
Run Code Online (Sandbox Code Playgroud)
它some_other_fun(..)本身就是一种interface{}类型.然而,这并不能工作,因为你无法通过[]DEFINITE_TYPE的[]interface{}.请参阅:https://golang.org/doc/faq#convert_slice_of_interface,其中指出[]接口{}的表示形式不同.这个答案总结了为什么,但是关于接口指针而不是接口切片,但原因是相同的:为什么我不能将*Struct分配给*接口?.
上面golang.org链接中提供的建议建议从DEFINITE_TYPE切片重建新的接口切片.但是,在我想要调用此函数的代码中到处都是不实际的(这个函数本身只是缩写9行代码,但是这9行在我们的代码中经常出现).
在我想要调用函数的每种情况下,我都会传递一个[]*DEFINITE_TYPE我最初认为更容易抽象的东西,直到我再次发现为什么我不能为*接口分配*Struct?(也在上面链接).
此外,每次我想调用它的功能都是不同的,DEFINITE_TYPE因此实现n个类型的n个示例不会为我节省任何代码行或使我的代码更清晰(恰恰相反!).
令人沮丧的是,我无法做到这一点,因为我们的代码中的9行是惯用的,而错误的类型很容易引入错误.我真的错过了泛型.有没有办法做到这一点?!!
我有以下功能:
func bytesToData(data interface{}, b []byte) error {
buf := bytes.NewBuffer(b)
dec := gob.NewDecoder(buf)
return dec.Decode(data)
}
Run Code Online (Sandbox Code Playgroud)
我使用它来获取进出boltdb的struct数据.我想做的是将签名更改为:
func bytesToData(data *interface{}, b []byte) error
Run Code Online (Sandbox Code Playgroud)
然后我希望能够像这样调用它(b在这种情况下是一个gob编码的Account)
acc := &Account{}
err := bytesToData(acc, b)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我得到一个错误Cannot use *Account for type *interface{}.
现在,我刚刚把它改回来了interface{}.但是,如果我Account直接传入一个或其他类型而不使它成为指针,gob会抛出一个错误.看起来这应该在编译时可以检查.并且假设类型的参数interface{}接受任何东西,为什么类型的参数不*interface{}接受指向任何东西的指针?