0
点赞
收藏
分享

微信扫一扫

golang标准库unsafe学习

黎轩的闲暇时光 2023-10-16 阅读 32

golang标准库unsafe学习

新建unsafe.go

package unsafe

import (
	"fmt"
	"unsafe"
)

type Test struct {
	Id   int64
	Name string
	Age  int
}

func UnSafeFunc() {
	test := Test{
		1,
		"test",
		15,
	}

	//返回结构体大小
	sizeof := unsafe.Sizeof(test)
	fmt.Println(sizeof)

	//返回结构体字段对齐大小
	alignof := unsafe.Alignof(test.Id)
	fmt.Println(alignof)

	//返回结构体字段相对于开始的偏移量
	iof := unsafe.Offsetof(test.Id)
	nof := unsafe.Offsetof(test.Name)
	aof := unsafe.Offsetof(test.Age)
	fmt.Println(iof, nof, aof)

	sb := "1ssdfsdfsdfsd"
	//返回字符串首字母byte指针
	sby := unsafe.StringData(sb)
	fmt.Println(sby)          //byte指针
	fmt.Println(*sby)         //byte数据
	fmt.Println(string(*sby)) //字符数据
	//返回从sb开始的切片,
	//如果长度在sb长度内,返回的都是sb的切片,如果大于sb长度可以返回其他非sb数据。
	//按50长度返回如下 1ssdfsdfsdfsd3814697265625: unknown pc === NAME  %
	//如果是0返回空
	sbs := unsafe.Slice(sby, 50)
	fmt.Println(sbs)
	fmt.Println(string(sbs))

	var bs []byte = []byte("ikejwrwe34")
	bss := unsafe.SliceData(bs)
	fmt.Println(bss)          //byte指针
	fmt.Println(*bss)         //byte数据
	fmt.Println(string(*bss)) //字符数据
	bssb := unsafe.String(bss, len(bs))
	fmt.Println(bssb)
	bssb = unsafe.String(bss, 100)
	fmt.Println(bssb)
}

// 字符串转byte
func StringToByteArray(s string) []byte {
	return unsafe.Slice(unsafe.StringData(s), len(s))
}

// byte转字符串
func ByteArrayToString(b []byte) string {
	return unsafe.String(unsafe.SliceData(b), len(b))
}

新建unsafe_test.go

package unsafe

import (
	"fmt"
	"testing"
)

func TestUnSafeFunc(t *testing.T) {
	UnSafeFunc()
	bt := StringToByteArray("wioeruwieour")
	fmt.Println(bt)

	st := ByteArrayToString([]byte("8932789423uhjsdf"))
	fmt.Println(st)
}

然后目录下执行

go test -v
举报

相关推荐

0 条评论