Go语言中使用flag.String返回指针后的解引用疑问
Go语言中使用flag.String返回指针后的解引用疑问
嗨,我来帮你理清楚这个疑问哈~
首先得说清楚flag.String这个函数的设计逻辑:它返回的是一个字符串指针(也就是*string类型),这可不是随便设计的。因为命令行参数的解析工作是在你调用flag.Parse()之后才完成的,用指针的话,flag包可以直接把解析出来的参数值写入到指针指向的内存地址里,不需要你再做额外的赋值操作。要是它返回的是普通的string类型,那flag.Parse()之后根本没法更新这个变量的值——毕竟Go里是值传递,函数传过去的是变量副本,修改副本不会影响原变量。
再看你的代码:
token := flag.String("t", "", "token for access to tg bot")这里的token是个指针,它存的是某个字符串变量的内存地址,而不是字符串本身。- 所以当你要判断这个值是不是空字符串时,必须用
*token来解引用,拿到指针指向的实际字符串值。要是你直接写token == "",那是把一个指针和空字符串做比较,类型都不匹配,肯定会报错的。 - 最后你的函数返回类型是
string,所以也得把指针解引用,拿到实际的字符串返回,总不能返回一个指针类型吧?
打个通俗的比方:token就像你手里攥着一张写着快递柜地址的纸条,你要拿到里面的快递(实际的字符串值),就得先根据纸条上的地址去取——这个“根据地址取东西”的动作,就是Go里的解引用*操作。
所以不是说“已经通过引用获取了就不用解引用”,而是flag.String给你的本来就是个“地址纸条”,你要用到实际内容的时候,必须通过这个纸条去取对应的东西,这就是为什么每次都要加*的原因啦。
备注:内容来源于stack exchange,提问作者Человек
相关产品推荐
相关产品推荐

