Что такое эквивалент Go эквивалент оператора «is» Python?

Как определить, ссылаются ли 2 переменные на один и тот же экземпляр в Go? Более конкретно, что мутация к значению одной переменной также повлияет на значение другой переменной.

Чтобы уточнить вопрос: как бы я определил, когда 2 переменные будут удовлетворять оператору «is» на CPython:

a is b 

В Python все значения являются ссылками (т.е. указателями) на объекты. Вы никогда не сможете получить объект как ценность. Оператор is сравнивает два значения, которые являются указателями, для равенства указателя; тогда как оператор == сравнивает два таких указателя для равенства объектов, на которые указывает.

В Го, это немного сложнее. Go имеет указатели, а также другие типы не указателей (логические, числовые типы, строки, массивы, срезы, структуры, функции, интерфейсы, карты, каналы). Не имеет смысла запрашивать равенство указателя для типов без указателей. (Что бы это значило? Что бы это получилось?)

Итак, чтобы иметь эквивалентную ситуацию как Python, давайте поместим все наши значения за указатели, и поэтому все переменные являются указателями. (Во многих библиотеках Go существует соглашение с функцией «Создать», которая создает тип указателя, а также методы, действующие на тип указателя, поэтому это совместимо с этим соглашением.) Затем (если a и b являются указателями) a == b в Go сравнивает два таких указателя для равенства указателя; и вы можете использовать *a == *b для сравнения базовых значений, если они сопоставимы.

Go также имеет несколько ссылочных типов без указателей: срезы, карты, функции и каналы. Каналы сопоставимы с использованием == для того, являются ли они одним и тем же каналом. Тем не менее, срезы, карты и функции нельзя сравнивать; однако это может быть возможно при использовании отражения.

EDIT: Я не уверен, что вы хотите. Если речь идет о равенстве переменных или идентичности переменных значений. Этот ответ для второго («2 переменные относятся к одному и тому же экземпляру» значения). Если я не понял, я удалю этот ответ.

Я думаю, это то, что вы хотите.

Если тип a и b является указателем, то a==b означает, что a и b являются указателями на одно и то же значение.

Следующая программа печатает false :

 package main import "fmt" type test struct { a int } func main() { b := &test{2} c := &test{2} fmt.Println(c == b) } 

Хотя это true :

  b := &test{2} c := b fmt.Println(c == b) 

c == b является достаточным условием для того, чтобы изменение смены ba

В случае неинтерфейса и не-функциональных типов можно сравнить указатели на равенство. Типы без указателей не могут обмениваться экземплярами OTOH.