Тщательно изучите указатели Go — изучите язык Go

Go
Тщательно изучите указатели Go — изучите язык Go

что такое указатель

При написании кода мы можем манипулировать хранящимися в памяти значениями через переменные, выполнять присваивания, операции сложения и вычитания и т.д. Вы когда-нибудь задумывались, что представляют собой переменные? Фактически переменной соответствует пространство памяти, и в этом пространстве хранится значение соответствующего типа переменной. Значение указателя соответствует адресу переменной, только через указатель можно обновить или прочитать значение переменной без использования имени переменной.

var i int = 10      //声明变量i,并初始化为10
var ptr *int = &i 
fmt.Println(ptr,*ptr)
// 0xc000018060 10  指针变量ptr存储的是i地址,*ptr对应指针指向的变量的值
*ptr = 12  				// i=12  更新指针指向的变量的值
fmt.Println(*ptr,i)		// 12 12

Приведенный выше код объявляет*intуказательная переменная типаptr, через адресного оператора&получить указатель на целочисленную переменнуюiадрес г. Указатель, так сказатьptrуказать на переменнуюi,Илиptrуказатель содержит переменнуюiадрес г.

объявление указателя

Благодаря объяснению предыдущего абзаца я считаю, что у всех есть четкое представление об указателе: указатель указывает на адрес памяти переменной. Чтобы использовать указатель, вы должны сначала объявить его в следующем формате:

var var_name *var_type
// var_name 指针名称,var_type 指针所指向的变量的类型
var i int = 10
str := "go"
var ip *int         // *int类型的指针
var pstr *string    // *string类型的指针
ip = &i
pstr = &str
fmt.Println(*ip,*pstr)     // 10 go

Уведомление:*intТип указателя, указывающий, что указатель должен указывать наintпеременная типа,*stringТипы тоже похожи.

str := "go"
var ip *int
ip = &str  // 编译不会通过

*intуказатель типа, на который указывает переменная, еслиstringtype компилятор сообщит об ошибке при компиляции:

cannot use &str (type *string) as type *int in assignment

Как использовать указатели

Статья написана здесь, о том, как использовать указатели, собственно, это было указано выше, в основном через три шага:утверждение,назначатьидоступзначение переменной, на которую указывает указатель

x,y := 1,"go"
var px *int = &x    	// 1、声明并初始化
var py = &y				// 2、省略指针类型,编译器自动判断
//px,py := &x,&y		// 3、使用 :=
fmt.Println(*px,*py) 	// 1 go   访问

Об нулевых указателях

Когда указатель объявлен, но ему не присвоено значение, он называется нулевым указателем, т. е.nil. Нулевое значение указателя любого типаnil.

var ip *int
fmt.Println(ip)							// nil
fmt.Printf("ip 的值为:%x", ip)			// ip 的值为:0

еслиip != nilистинно, то p указывает на некоторую допустимую переменную. Указатели также могут быть проверены на равенство, только если они указывают на одну и ту же переменную или на обе переменные.nilвремя равно.

1、指向同一个变量 true
x,_ := 1,1
px,py := &x,&x
fmt.Println(px == py) 
 
2、指向不同变量 false
x,y := 1,1
px,py := &x,&y
fmt.Println(px == py)

3、两个nil指针 true
var px *int
var py *int
fmt.Println(px == py)

Используйте указатели в качестве параметров функции

Указатель содержит адрес переменной.Если указатель передается как параметр функции, значение переменной может быть обновлено с помощью указателя.

func a(p *int){
	*p++
}

i := 10
fmt.Println(i)      // 10
a(&i);
fmt.Println(i)		// 11

Необычная новая функция

Позвольте представить вамnewфункция, встроенныйnewФункции также являются способом создания переменных,new(type)означает создатьtypeАнонимная переменная типа и инициализированная дляtypeВозвращается нулевое значение типа, адрес переменной и тип указателя.*type.

p := new(int)   	// p, *int 类型, 指向匿名的 int 变量
fmt.Println(*p) 	// 0
*p = 2          	// 设置 int 匿名变量的值为 2
fmt.Println(*p) 	// 2

использоватьnewНет никакой разницы между созданием переменной с помощью функции и созданием переменной с помощью обычного оператора объявления переменной, за исключением того, что нет необходимости объявлять имя временной переменной. Следующие две функции ведут себя одинаково:Создать переменную и вернуть адрес переменной

func newA() *int {
    return new(int)
}
func newB() *int {
    var i int
    return &i
}

каждый звонокnewОбе функции возвращают адрес новой переменной:

p := new(int)
q := new(int)
fmt.Println(p,q)   // 0xc000018060 0xc000018068

newФункция используется меньше, но я думаю, что она очень интересна, поэтому я поделюсь ею с вами здесь! В реальном программировании больше переменных создается с конкретными типами, ведь так удобнее, правда!


(Конец полного текста)

Оригинал статьи, если нужно перепечатать, указывайте источник!
Добро пожаловать, чтобы отсканировать код и подписаться на официальный аккаунт »Голанг здесь” или двигатьсяseekload.net, см. больше замечательных статей.

Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!

公众号二维码