请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

双引号里能包含一种形式的单引号,而又不能包含另外一种形式的单引号,这其中似乎没有道理可循是吗?

正在回答 回答被采纳积分+3

2回答

少林码僧 3小时前

核心原因:Go 语言的转义规则设计

Go 语言对字符串转义的语法做了明确且严格的限制,核心目的是避免歧义、提升代码可读性,具体可以从这几点理解:

1. 转义序列的设计分工

Go 为不同场景设计了不同的转义方式,且对八进制转义做了 “功能限制”:

  • 专用转义符:对于双引号 (")、单引号 (')、反斜杠 (\) 这类高频使用的特殊字符,Go 提供了专门的转义符(\"\'\\),这是推荐且唯一合法的八进制外写法。

  • 八进制转义\ooo(1-3 位八进制数)是从 C 语言继承的语法,但 Go 刻意禁用其表示上述特殊字符—— 因为如果允许八进制表示"/'/\,会和专用转义符产生语义歧义,也容易让开发者写错(比如八进制数记错)。

  • 十六进制 / Unicode 转义\xhh(2 位十六进制)、\uhhhh(4 位 Unicode)、\Uhhhhhhhh(8 位 Unicode)是通用字符编码表示,设计初衷就是覆盖所有 Unicode 字符,因此没有限制表示"/'这类字符。

2. 编译器的语法校验逻辑

Go 编译器在解析字符串时:

  • 遇到八进制转义\47(单引号)、\42(双引号)时,会直接判定为 “非法八进制转义”—— 因为这些字符已有专用转义符,八进制方式属于 “违规用法”。

  • 遇到十六进制\x27/\x22或 Unicode\u0027/\u0022时,编译器会将其解析为对应的 ASCII 字符,这符合通用编码规则,因此合法。


0 回复 有任何疑惑可以回复我~
  • 提问者 洛奇2019 #1
    老师,teststr := '\047'  这样写可以通过编译,但把零去掉就不行,所以双引号里还是可以用单引号的八进制转义的
    回复 有任何疑惑可以回复我~ 2小时前
少林码僧 20小时前

请举一个具体的例子说明

0 回复 有任何疑惑可以回复我~
  • 提问者 洛奇2019 #1
    就是想请教老师记忆方法,也是想知道为什么八进制的单引号不可以被双引号包裹,而十六进制的单引号就可以,这其中有什么讲究吗?
    回复 有任何疑惑可以回复我~ 20小时前
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号