dongshuzhuo5659 2016-05-18 11:21
浏览 137
已采纳

GoLang上的接口函数调用

I am having a problem go interfaces.

Here is my main.go file;

package main

import (
    "fmt"
    "bitbucket.org/xyz/trash/a"
)

// Second -
type Second interface {
    Area() float64
}

// Area -
func Area() float64 {
    return 2
}


func main() {

    r := new(a.Rect)

    n := new(Second)

    r.F = *n

    fmt.Println(r.Area()) 

}

And my other package, a.go;

package a

// First -
type First interface {
    Area() float64
}

// Rect -
type Rect struct {
    F First 
}

// Area -
func (r Rect) Area() float64 {
    return 1
}

I am expecting this line

fmt.Println(r.Area())

to print "2", not "1". What am i missing?

Thanks for your help.

  • 写回答

2条回答 默认 最新

  • doujiao1180 2016-05-20 22:17
    关注

    First, look at your code again. As written, a.Rect.Area() returns 1. It always returns 1. Set all the properties you like. It returns 1. Gnash your teeth and curse the gods. It returns 1. Because it's a function that returns 1. That's what it does.

    Write it like this:

    // Area -
    func (r Rect) Area() float64 {
        return r.F.Area()
    }
    

    ...and you'll panic because you've got another issue.

    Area() in main.go doesn't have a receiver. It has nothing to do with interfaces. It's just a function. No objects. No implementing anything. No polymorphism. No nothing.

    You've declared n as a pointer to an interface, not an implementation of an interface. It's nil. If you try to dereference it the whole world will come crashing down into the void.

    If you want to be able to call n.Area() then make Second a concrete type.

    (In main.go)

    // Second -
    type Second struct {}
    
    // Area -
    func (s Second) Area() float64 {
        return 2
    }
    

    Do you see the difference? Second is now a struct that implements the interface a.First because it is the receiver of an appropriate Area() method. Thus you will get the expected behavior.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何解决蓝牙通话音频突发失真问题
  • ¥15 安装opengauss数据库报错
  • ¥15 【急】在线问答CNC雕刻机的电子电路与编程
  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas
  • ¥15 蓝牙硬件,可以用哪几种方法控制手机点击和滑动
  • ¥15 生物医学数据分析。基础课程就v经常唱课程舅成牛逼
  • ¥15 云环境云开发云函数对接微信商户中的分账功能
  • ¥15 空间转录组CRAD遇到问题