go实例化接口的时候,是不是只能用var?

是不是不能用:=的方式实例化一个接口?为什么?

package main

import (
    "fmt"
    "testing"
)

type Programmer interface {
    WriteHelloWorld() string
}

type GoProgrammer struct{}

func (g *GoProgrammer) WriteHelloWorld() string {
    fmt.Println("I am GO PROG")
    return "I am go PROG"
}

func TestClient(t *testing.T) {
    var p Programmer // 这样OK  
    // p := Programmer  // <- 会报错 Type 'Programmer' is not an expression
    p = new(GoProgrammer)
    p.WriteHelloWorld()
    t.Log(p.WriteHelloWorld())
}
阅读 1.8k
1 个回答

interface是一个抽象, 就像c++里的抽象类一样是不能实例化的.
可以实例化的是实现了interface的方法的struct.

或者你也可以这样写

func TestClient(t *testing.T) {
    //var p Programmer // 这样OK
    p := Programmer(nil)
    p = new(GoProgrammer)
    p.WriteHelloWorld()
    t.Log(p.WriteHelloWorld())
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题