package main import "fmt" type Aer interface{ Name()string PrintName() } type A struct { } func (a *A) Name() string { return "a" } func (a *A) PrintName() { fmt.Println(a.Name()) } type B struct { A } func (b *B) Name() string { return "b" } func getAer() Aer { return &B{} } func main() { a := getAer() a.printName() }
这个实现中,golang输出的是a,这个实现违反了通常C++,Java,Python中会输出b的实现,由于上述几个语言的思维习惯已经形成,那么这个实现就会导致很多意想不到的事情。
昨儿个在golang实践群
package main import ( "encoding/json" "fmt" ) type request struct { Operations map[string]op `json:"operations"` } type op struct { operation Test string `json:"test"` } type operation struct { Width int `json:"width"` Height int `json:"height"` } func (o *operation) UnmarshalJSON(b []byte) error { type xoperation operation xo := &xoperation{Width: 500, Height: 500} if err := json.Unmarshal(b, xo); err != nil { return err } *o = operation(*xo) return nil } func main() { jsonStr := `{ "operations": { "001": { "test":"test", "width": 100 } } }` req := request{} json.Unmarshal([]byte(jsonStr), &req) fmt.Println(req) }
이 구현에서 golang은 a를 출력합니다. 이 구현은 C++, Java 및 Python에서 일반적인 b 구현을 위반합니다. 위 언어의 사고 습관이 형성되었으므로 이 구현은 많은 혼란을 야기합니다. . 예상치 못한 일들.
어제 golang 연습 그룹
에서 좋아했던 형제(이 형제는 내가 물어본 위의 질문을 알고 이것이 golang의 구현이라고 말했습니다)가 UnmarshalJSON에 대해 물었습니다. 테스트 필드에 값이 할당되지 않고 golang에서 문제가 발생한 이유
그의 코드는 다음과 같습니다.
rrreee이 문제의 본질은 제가 제기한 것과 동일합니다. 연산이 op에 포함되어 있기 때문입니다. 그래서 UnmarshalJSON이 있는데, json 패키지의 Unmarshaler 인터페이스를 따르기 때문에 인터페이스를 내부적으로 처리하는데 사용할 때는 op는 만족하지만 실제로 처리되는 것은 오퍼레이션, 즉 오퍼레이션을 엔터티로 사용하는 것이다. UnmarshalJSON을 수행하면 이상한 오류 메시지가 나타납니다.
이곳은 golang 구현에 있어 매우 보기 흉한 곳이라고 생각합니다.