当前位置: 首页 > 面试题库 >

在Go中引用字符串文字

訾高飞
2023-03-14
问题内容

在我的应用程序中,我将经常传递对静态字符串的引用。我希望避免让Go为每个调用分配内存,但是我无法将地址获取到字符串文字。

为什么不能采用字符串文字的地址(请参见test1()下面的示例)?我是否误解了语法,还是由于Go的内部运作而受到限制?

如果不可能的话,最好的解决方案是什么?

test2()可以,但是var hej每次都会分配内存吗?
test3()不会分配任何新的内存,但我希望避免该函数之外的混乱情况。

package main

import "fmt"

var konnichiwa = `こんにちは世界`

// Gives the compile error `cannot take the address of "Hello world"`
func test1() (*string) { return &`Hello world` }

// Works fine
func test2() (*string) {
    hej := `Hej världen`
    return &hej
}

func test3() (*string) { return &konnichiwa }

func main(){
    fmt.Println(*test1())
    fmt.Println(*test2())
    fmt.Println(*test3())
}

感谢帮助!


问题答案:

接受文字(字符串,数字等)的地址是非法的,因为它的语义不明确。

您是否要使用实际常数的地址?这将允许修改值(并可能导致运行时错误),还是要分配新对象,将常量复制过来并将地址获取到新版本?

在这种情况下不存在这种歧义,test2因为您正在处理的语义已明确定义的现有变量。如果将字符串定义为,则将无法正常工作const

语言规范通过明确不允许您的要求来避免这种歧义。解决方法test2。虽然稍微冗长一些,但它使规则保持简洁明了。

当然,每条规则都有其例外,在Go中,这涉及到复合文字:以下内容合法,并在规范中进行了定义:

func f() interface{} {
    return &struct {
        A int
        B int
    }{1, 2} 
}


 类似资料:
  • 问题内容: 你被输出误导了-你所采用的第二种方法实际上可以实现你想要的,只是你不相信它. 顺便说一句,还有另一种字符串形式可能会更清晰一些: 问题答案: 你被输出误导了-你所采用的第二种方法实际上可以实现你想要的,只是你不相信它。 顺便说一句,还有另一种字符串形式可能会更清晰一些:

  • 问题内容: 文件names.txt由许多名称组成,格式为: 有谁知道如何分割字符串,以便用逗号分隔各个名称? 以下代码按逗号分隔,并在名称两边加上引号,什么是转义字符以分隔出。可以在一个Split语句中完成,拆分并用逗号分隔吗? 顺便说一句,这是Project Euler问题#22的一部分。http://projecteuler.net/problem=22 问题答案: 杰里米(Jeremy)的回

  • 问题内容: 我正在尝试从控制台(包括空格)读取整行,然后对其进行处理。使用bufio.ReadString,将换行符与输入一起读取,因此我想出了以下代码来修剪换行符: 有没有更惯用的方法来做到这一点?也就是说,是否已经有一个库在为您提取子字符串时负责处理结尾的空字节? (是的,我知道在go readline->string中已经有一种不用换行符就能读取行的方法,但是我正在寻找更多用于优雅的字符串操

  • 问题内容: 使用正则表达式的python中的代码可以执行类似这样的操作 谢谢 问题答案: 这是您需要做的所有事情: 正如叶立昂指出:(我几乎引用) 是的“非贪婪”版本。它使正则表达式匹配的字符数最少,而不是最多。贪婪的版本会给出字符串;非贪婪版本‘String 1,String 2,String3’ 另外(再次使用Johan,),如果您想接受空字符串,请更改为。星号表示零个或多个-加号表示至少一个

  • 问题内容: 在此结构定义中: 字符串 “ json:message” 的含义是什么,以及如何访问它(如果可访问)。先感谢您。 问题答案: 这些是结构标记。包使用此struct标记 将对象转换为JSON,并将 JSON字符串转换为对象 在将一个结构封送(编码)为JSON字符串时,它将查找此struct标记以分配 键名,如果不存在,则它可能会使用结构字段名本身 顺便说一句语法是错误的 这是供参考的示例

  • 问题内容: 我是Go的新手,正在尝试执行以下操作: 我搜索了很多,但真的不知道该怎么做。 我知道这行不通: 问题答案: 这不是实现它的最有效方法,但是您可以简单地编写: 被称为: