2
package main

import (
    "fmt"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/route53"
)

func main() {
    sess := session.Must(session.NewSession())
    client := route53.New(sess)
    zones, err := client.ListHostedZones(&route53.ListHostedZonesInput{
        MaxItems: aws.String("100"),
    })
    if err != nil {
        fmt.Printf("Error occurred")
    }
    fmt.Printf("%v", zones)
    if zones.IsTruncated {
        fmt.Printf("%v", zones.NextMarker)
    }
}

由于以下情况,上面的代码失败。

if zones.IsTruncated {
    fmt.Printf("%v", zones.NextMarker)
}

结果是

non-bool zones.IsTruncated (type *bool) used as if condition

我想知道的是为什么常规类型(bool)和类型(* bool)之间存在差异。我知道一个是指针值,但是条件应该仍然有用。

这是没有条件的输出的尾部片段

IsTruncated: true,
MaxItems: "100",
NextMarker: "Wouldn'tYouLikeToKnow"
}
4

2 回答 2

7

来自标准参考

“If”语句根据布尔表达式的值指定两个分支的条件执行。

因此,要回答您的问题,if语句明确需要布尔表达式。*bool仍然没有bool。您需要显式取消引用指针(在这种情况下您的程序会恐慌,它甚至可能是 nil)。

以下是重写 if 语句的方法:

if *zones.IsTruncated {
    fmt.Printf("%v", zones.NextMarker)
}

但要确保它不是零

于 2017-08-26T22:58:06.087 回答
1

您需要取消对结构的引用。您需要使用 := 运算符来执行此操作。就像是 -

new_struct := *your_pointer

然后,您将改用 new_struct。

于 2017-08-26T22:48:17.633 回答