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