Golang中如何返回字符串
Golang中如何返回字符串 在这段代码中,https://play.golang.org/p/GzNV2-meQTb, “s” 是否与 “s1” 相关?如果相关,是如何关联的?代码中是否有线索提示这一点?
3 回复
不。函数 foo 返回一个字符串,由 main 函数打印输出。你可以去掉 s 和 s1 而不改变程序功能:
package main
import (
"fmt"
)
func main() {
fmt.Println(foo())
}
func foo() string {
return "Hello world"
}
在提供的代码中,s 和 s1 是相关的,因为它们都指向同一个字符串字面量 "hello" 在内存中的地址。Go 语言中的字符串是不可变的,编译器会对相同的字符串字面量进行优化,使它们共享底层数据。
以下是代码分析:
- 函数
f返回一个字符串"hello",赋值给s。 - 变量
s1直接赋值为字符串字面量"hello"。 - 通过
unsafe包获取字符串数据的指针,比较s和s1的底层数据地址是否相同。
示例代码演示:
package main
import (
"fmt"
"unsafe"
)
func f() string {
return "hello"
}
func main() {
s := f()
s1 := "hello"
ptrS := (*uintptr)(unsafe.Pointer(&s))
ptrS1 := (*uintptr)(unsafe.Pointer(&s1))
fmt.Printf("s data address: %p\n", *ptrS)
fmt.Printf("s1 data address: %p\n", *ptrS1)
fmt.Printf("Addresses equal: %t\n", *ptrS == *ptrS1)
}
运行结果会显示 s 和 s1 的底层数据地址相同,证明它们共享同一个字符串 "hello" 的内存。代码中的线索是使用 unsafe.Pointer 直接比较字符串数据的地址,这明确揭示了关联性。

