اشاره‌گرها به یک رابط

تقریباً هیچ وقت نیاز به اشاره‌گرها به انواع رابط ندارید. شما باید رابط‌ها را به صورت مقدار ارسال کنید و با انجام این کار، داده پایه ارسال شده هنوز می‌تواند یک اشاره‌گر باشد.

رابط‌ها در واقع با دو فیلد در سطح پایه نمایش داده می‌شوند:

  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، خود رابط یک نوع اشاره‌گر است. به عبارت دیگر، نوع رابط خود یک اشاره‌گر است. برای نیازهای من، پارامتر برای تست تنها باید ماینترفیس باشد و من تنها نیاز دارم که یک نوع *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) // نادرست
}