来自Python,我目前正在学习Go,并试图将自己的头缠在指针上。
为了理解这个概念,我编写了以下代码:
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
*b++
fmt.Println(a) // Shows the value 2 (as expected)
我尝试使用这段代码来增进理解。但是,以下内容不起作用:
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
b = *b + 1 // Compile error: invalid operation: b * +1 (mismatched types *int and int)
fmt.Println(a)
显然,*b
的类型为*int
,而值1
(显然)的类型为int
。但是,为什么在第一个示例中可以用*b++
来增加a的值?
答案 0 :(得分:1)
为什么无法在Go中的“已取消引用”的指针变量中添加整数?
b
是一个指针,被取消引用的b
被写为*b
。 b = *b + 1
无效,因为您正在尝试将整数转换为指针,即使显式类型转换也无法实现。相反,您需要修改指针指向的数据,而不是指针本身:*b = *b + 1
。
在此处查看有关*b++
为何起作用的Go规范:https://golang.org/ref/spec
运算符优先级
一元运算符的优先级最高。由于++和-运算符形成语句而不是表达式,因此它们不在运算符层次结构之内。结果,语句* p ++与(* p)++相同。
答案 1 :(得分:1)
从一开始:
b := &a
此处,b
类型为*int
,是指向内存中存储a
值的位置的指针。当您执行*b
时,您正在从b
指针所指向的位置访问一个值。
执行*b++
时,它代表*b = *b + 1
,并且您正在指针b
所指向的位置上增加一个值。
b = *b + 1
无效,因为您试图将*b
和1
这两种类型的int
和b
添加到指针*int
中(hostServiceDict = {"http://192.168.1.1:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO'],
"http://192.168.1.2:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'UDDC'],
"http://192.168.1.3:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'HTTPServer'],
"http://192.168.1.4:8080/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'NetcdfSubset'],
"http://192.168.1.5:8080/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'WCS', 'NCSS'],
"http://192.168.1.5:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'WCS', 'NCSS'],
"http://192.168.1.6:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'DAP4'],
"http://192.168.1.7:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'NCML', 'DAP4'],
"http://192.168.1.8:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'NetcdfSubset'],
"http://192.168.1.9:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'UDDC'],
"http://192.168.1.18:80/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'NetcdfSubset'],
"http://192.168.1.18:8800/thredds/catalog.xml": ['OPENDAP', 'WMS', 'HTTP', 'ISO', 'NetcdfSubset']
}
的类型)。
答案 2 :(得分:1)
您正在向*int
添加int
。因此,错误。
由于b是指向整数的指针,因此要对该整数进行任何操作(读或写),都需要取消引用。下面的代码将按预期工作。这就是*b++
内部所做的事情。
package main
import (
"fmt"
)
func main() {
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
*b = *b + 1 // No Compile error
fmt.Println(a) // Shows the value 2
}
答案 3 :(得分:0)
可以将整数添加到已取消引用(整数)的指针变量中,并且在您的情况下可以正常工作。但是,出于类型安全原因,在Go中将此值分配给指针变量是不可接受的。并且通常不需要(但是有一种方法可以引用任何给定的地址)。希望这可以澄清它。