مؤشرات إلى واجهة

نادرًا ما تحتاج إلى مؤشرات لأنواع الواجهة. يجب عليك تمرير الواجهات بقيمة، وبذلك، يمكن للبيانات الأساسية المرور أن تكون لا تزال مؤشرًا.

تُمثل الواجهات في الأساس بحقلين على المستوى الأساسي:

  1. مؤشر إلى معلومات نوع محدد. يمكنك التفكير فيه على أنه "النوع".
  2. مؤشر بيانات. إذا كانت البيانات المخزنة هي مؤشر، يتم تخزينها مباشرة. إذا كانت البيانات المخزنة هي قيمة، يتم تخزين مؤشر إلى تلك القيمة.

إذا كنت ترغب في أن تعدل أساليب الواجهة في البيانات الأساسية، يجب عليك استخدام استقبالات المؤشر (قم بتعيين مؤشر الكائن إلى متغير الواجهة).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() لا يمكنه تعديل البيانات الأساسية
// f2.f() يمكن تعديل البيانات الأساسية، يتم تعيين مؤشر الكائن إلى متغير الواجهة f2
var f1 F = S1{}
var f2 F = &S2{}

لا تستخدم مؤشرات لواجهة، فذلك لا معنى له. في لغة Go، فإن الواجهة نفسها هي نوع مرجعي. بمعنى آخر، نوع الواجهة نفسه هو مؤشر. بالنسبة لاحتياجاتي، يحتاج معلمة الاختبار إلى أن تكون فقط نوع myinterface، ويجب أن أقوم بتمرير نوع *mystruct (ويمكنني فقط تمرير نوع *mystruct) عند تمرير القيمة.

type myinterface interface {
	print()
}

func test(value *myinterface) {
	// شيء ما للقيام به...
}

type mystruct struct {
	i int
}

// تنفيذ الواجهة
func (this *mystruct) print() {
	fmt.Println(this.i)
	this.i = 1
}

func main() {
	m := &mystruct{0}
	test(m) // غير صحيح
	test(*m) // غير صحيح
}