最近正好试着把自己写的一个Python工具用Golang重写一遍来做个比较,顺便评估一下Golang这个语言。结果遇到一个接口冲突导致Stack Overflow的问题。以下是示例代码

package main

import (
	"encoding/json"
	"fmt"
)

type IJSON interface {
	MarshalJSON() ([]byte, error)  // This interface signature is the same as "encoding/json/Marshaler"
}

type Student struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func (s *Student) MarshalJSON() ([]byte, error) {
	return json.Marshal(s)
}

func main() {
	s := &Student{"James", 12}

	data, err := s.MarshalJSON()
	if err != nil {
		panic(err)
	}

	fmt.Printf("%s", data)
}
json.MarshalMarshaler
// Marshaler is the interface implemented by types that
// can marshal themselves into valid JSON.
type Marshaler interface {
	MarshalJSON() ([]byte, error)
} 
MarshalJSON

一直以来就对Golang的隐式接口实现没有好感,完全不知道一个类型实现了什么接口,接口与接口之间有什么关系。