Con trỏ đến một giao diện

Hầu hết các trường hợp, bạn gần như không cần đến con trỏ đến kiểu giao diện. Bạn nên truyền các giao diện theo giá trị, và khi làm như vậy, dữ liệu cơ bản sẽ vẫn được truyền dưới dạng con trỏ.

Ở cấp độ cơ bản, giao diện được biểu diễn với hai trường:

  1. Một con trỏ đến thông tin kiểu cụ thể. Bạn có thể hiểu đó như là "kiểu".
  2. Một con trỏ dữ liệu. Nếu dữ liệu được lưu trữ là một con trỏ, nó được lưu trữ trực tiếp. Nếu dữ liệu được lưu trữ là một giá trị, một con trỏ đến giá trị đó được lưu trữ.

Nếu bạn muốn phương thức giao diện sửa đổi dữ liệu cơ bản, bạn phải sử dụng bộ thu phân con trỏ (gán con trỏ đối tượng vào biến giao diện).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() không thể sửa đổi dữ liệu cơ bản
// f2.f() có thể sửa đổi dữ liệu cơ bản, con trỏ đối tượng được gán vào biến giao diện f2
var f1 F = S1{}
var f2 F = &S2{}

Không bao giờ sử dụng con trỏ đến giao diện, điều đó vô nghĩa. Trong ngôn ngữ Go, chính giao diện chính nó là kiểu tham chiếu. Nói cách khác, kiểu giao diện chính là một con trỏ. Đối với nhu cầu của tôi, tham số để kiểm thử chỉ cần là myinterface, và tôi chỉ cần truyền một *mystruct type (và chỉ có thể truyền một *mystruct type) khi truyền giá trị.

type myinterface interface{
	print()
}

func test(value *myinterface){
	//làm một số việc ...
}

type mystruct struct {
	i int
}

// Thực hiện giao diện
func (this *mystruct) print(){
	fmt.Println(this.i)
	this.i=1
}

func main(){
	m := &mystruct{0}
test(m) // Không đúng
test(*m) // Không đúng
}