что такое указатель
При написании кода мы можем манипулировать хранящимися в памяти значениями через переменные, выполнять присваивания, операции сложения и вычитания и т.д. Вы когда-нибудь задумывались, что представляют собой переменные? Фактически переменной соответствует пространство памяти, и в этом пространстве хранится значение соответствующего типа переменной. Значение указателя соответствует адресу переменной, только через указатель можно обновить или прочитать значение переменной без использования имени переменной.
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
указатель типа, на который указывает переменная, еслиstring
type компилятор сообщит об ошибке при компиляции:
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, см. больше замечательных статей.
Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!