当前位置: 首页 > article >正文

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信号,导致程序异常结束


http://www.kler.cn/news/309328.html

相关文章:

  • 使用Python实现深度学习模型:智能家电控制与优化
  • Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程
  • iOS 知识点记录
  • 区块链积分系统:革新支付安全与用户体验的未来
  • 【Petri网导论学习笔记】Petri网导论入门学习(三)
  • 启信产业大脑助力市北高新园区数字化升级,开启智慧园区新篇章
  • 自己建网站怎么建
  • OpenCV结构分析与形状描述符(24)检测两个旋转矩形之间是否相交的一个函数rotatedRectangleIntersection()的使用
  • 网络安全学习(五)Burpsuite实战
  • 解决Matlab报错:MEX 文件 ‘D:\MATLAB\toolbox\maple\maplemex.mexw64‘ 无效: 缺少依赖共享库
  • 2024年某大厂HW蓝队面试题分享
  • Github打不开解决方法
  • 产品经理有必要学习大模型技术吗?
  • 【Elasticsearch系列十一】聚合 DSL API
  • 地平线秋招2025
  • 大数据处理技术:企业岗位需求决策
  • 【机器学习】--- 深度学习中的注意力机制
  • bootstrap application nacos环境配置失效
  • C++——stack和queue的模拟实现
  • 重学SpringBoot3-SpringApplicationRunListener
  • GORM查询指南:高效检索数据
  • 认识数学建模,什么是数学建模
  • 小红书热门系列,风口副业项目AI宠物壁纸号,玩法分享
  • AI教你学Python 第10天 :参数与返回值
  • TAPD卓越版的全面评测:超强的功能与用户体验优势
  • linux下日志系统setvbuf接口及结构体 handle_file_t成员介绍
  • 学习之git的团队协作
  • Qt问题笔记
  • Selenium之下拉框操作详解
  • MySQL5.7-虚拟列