英文:
Difference between bool and *bool
问题
以下是翻译好的代码部分:
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("发生错误")
}
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"
}
英文:
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)
}
}
The code above fails due to the following condition.
if zones.IsTruncated {
fmt.Printf("%v", zones.NextMarker)
}
with the result of
non-bool zones.IsTruncated (type *bool) used as if condition
What I want to know is why is there a difference between a regular type(bool) and type(*bool). I understand one is a pointer value however, the condition should still be useful.
Here is a tailed snippet of the output without the condition in place
IsTruncated: true,
MaxItems: "100",
NextMarker: "Wouldn'tYouLikeToKnow"
}
答案1
得分: 8
根据标准参考的说明:
> "if"语句根据布尔表达式的值指定条件执行两个分支。
所以,回答你的问题,if
语句明确要求布尔表达式。*bool
仍然不是bool
类型。你需要显式地解引用指针(即使指针可能为nil,在这种情况下,你的程序将会出错)。
以下是你如何重写if语句的示例:
if *zones.IsTruncated {
fmt.Printf("%v", zones.NextMarker)
}
但请确保它不是nil。
英文:
From standard reference:
> "If" statements specify the conditional execution of two branches according to the value of a boolean expression.
So, to answer your question, if
statements explicitly require boolean expressions. *bool
is still not bool
. You need to explicitly dereference the pointer (which could even be nil in which case your program will panic).
Here's how you would re-write your if statement:
if *zones.IsTruncated {
fmt.Printf("%v", zones.NextMarker)
}
but make sure it is not nil
答案2
得分: 2
你需要对一个结构体进行解引用。你需要使用 := 运算符来完成。类似这样 -
new_struct := *your_pointer
然后你可以使用 new_struct。
英文:
You need to dereference to a struct. You need to use the := operator to do so. Something like -
new_struct := *your_pointer
You would then use the new_struct instead.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论