为什么在Go中无法将整数添加到“已取消引用”的指针变量中?

时间:2018-09-08 07:07:23

标签: pointers go types

来自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的值?

4 个答案:

答案 0 :(得分:1)

  

为什么无法在Go中的“已取消引用”的指针变量中添加整数?

b是一个指针,被取消引用的b被写为*bb = *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无效,因为您试图将*b1这两种类型的intb添加到指针*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
}

在这里尝试: https://play.golang.org/p/2RX1CWD-AQC

答案 3 :(得分:0)

可以将整数添加到已取消引用(整数)的指针变量中,并且在您的情况下可以正常工作。但是,出于类型安全原因,在Go中将此值分配给指针变量是不可接受的。并且通常不需要(但是有一种方法可以引用任何给定的地址)。希望这可以澄清它。