golang 字符串浅析

go的字符串是只读的
测试源代码
package main

import (
	"fmt"
	"unsafe"
)

func swap(x, y string) (string, string) {
	return y, x
}

func print_string(obj *string, msg string) {
	string_ptr := (*[2]uintptr)(unsafe.Pointer(obj))
	first_obj_addr := string_ptr[0] // 存储字符串地址的对象

	first_byte := (*[5]uint8)(unsafe.Pointer(first_obj_addr)) // 将uintptr转成可解引用的地址
	fmt.Printf("%s\n", msg)
	fmt.Printf("\t%p\n", first_byte)
	fmt.Printf("\t%c\n", *first_byte)

	// first_byte[0] = 'E' // line 21
}

func test_swap() {
	var a, b string = "Hello", "World"

	fmt.Println(unsafe.Sizeof(string("")))

	print_string(&a, "-------a-------")
	print_string(&b, "-------b-------")

	a, b = swap(a, b)

	print_string(&a, "-------a-------")
	print_string(&b, "-------b-------")

	// 经过上述测试, 字符串结果为两个变量, 第一个地址, 第二个长度
	// sizeof(string)大小为16
	// swap的本质类似于std::move, 将a和b的内部变量进行了交换, 并没有将字符串进行拷贝
}

func main() {
	test_swap()
	for {

	}
}

程序启动

在这里插入图片描述
查看程序在linux的内存分布
在这里插入图片描述
a和b所指向的字符串的地址在只读段,故当放开21行尝试修改内存时,会触发SIGSEGV信号,导致程序异常结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值