Giả sử tôi có đoạn mã sau:Trong Go, tại sao phương thức giao diện Stringer của tôi không được gọi? Khi sử dụng fmt.Println
package main
import "fmt"
type Car struct{
year int
make string
}
func (c *Car)String() string{
return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}
func main() {
myCar := Car{year:1996, make:"Toyota"}
fmt.Println(myCar)
}
Khi tôi gọi fmt.Println (myCar) và các đối tượng trong câu hỏi là một con trỏ, phương pháp chuỗi của tôi() được gọi là đúng. Nếu, tuy nhiên đối tượng là một giá trị, đầu ra của tôi được định dạng bằng cách sử dụng định dạng mặc định được tích hợp vào Go và mã của tôi để định dạng đối tượng đã nói không được gọi.
Điều thú vị là trong cả hai trường hợp nếu tôi gọi myCar.String() theo cách thủ công, nó hoạt động đúng cho dù đối tượng của tôi là con trỏ hay giá trị.
Làm cách nào để có được đối tượng được định dạng theo cách tôi muốn cho dù đối tượng có dựa trên giá trị hay dựa trên con trỏ khi được sử dụng với Println?
Tôi không muốn sử dụng một phương pháp giá trị cho chuỗi bởi vì sau đó điều đó có nghĩa là mỗi lần nó được gọi đối tượng được sao chép mà đường nối không hợp lý. Và tôi không muốn phải luôn luôn được gọi bằng tay .String() hoặc bởi vì tôi đang cố gắng để cho hệ thống gõ vịt làm việc đó.
Cảm ơn trước!
-Ralph
Tôi cho rằng nó cũng là một phần vì ngôn ngữ sẽ không cung cấp cho bạn một con trỏ với những gì được lưu trữ bên trong một giá trị giao diện (vì địa chỉ đó có thể kết thúc đại diện cho một kiểu khác nếu một cái gì đó khác được gán cho giao diện). –
@ JamesHenstridge, tại sao không để lại giá trị cũ trong một con trỏ trong trường hợp đó? – starius