1. 程式人生 > >Go語言string與[]byte型別轉化避免拷貝

Go語言string與[]byte型別轉化避免拷貝

在Go語言中string型別與[]byte強制型別轉化的是後會發生記憶體拷貝,這是由於這兩種型別的特性所決定的;
string型別是不允許修改內容,[]byte是可以修改的。

下面提供兩個函式使用時不會發生記憶體拷貝嗎,但是使用過程中藥慎重,確保不會修改底層內容,否則很大可能會導致程式異常

import (
    "reflect"
    "unsafe"
)

func String(b []byte) (s string) {
    pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    pstring := (*reflect.StringHeader
)(unsafe.Pointer(&s)) pstring.Data = pbytes.Data pstring.Len = pbytes.Len return } func Slice(s string) (b []byte) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pbytes.Data = pstring.Data pbytes.Len
= pstring.Len pbytes.Cap = pstring.Len return }

相關推薦

Go語言string[]byte型別轉化避免拷貝

在Go語言中string型別與[]byte強制型別轉化的是後會發生記憶體拷貝,這是由於這兩種型別的特性所決定的; string型別是不允許修改內容,[]byte是可以修改的。 下面提供兩

go hex string[]byte轉換

hex string to []byte import "hex" // 省略部分程式碼.... hexStr := "fee9ecaadafeee72d2eb66a0bd344cdd" data, err := hex.DecodeString(hex

string byte[] 的相互轉化

 1、String 到 byte[]String str = new String("hello world");byte[] by = str.getBytes();2、byte[] 到StringString str = new String("hello world")

轉:Java中Stringbyte[]的轉換

輸出字符串 單個字符 linu 編輯 繁體 中國人 對象 本質 計算機基礎知識 String s = "fs123fdsa";//String變量 byte b[] = s.getBytes();//String轉換為byte[] String t = new Stri

C# StringByte數組的轉換

pan style clas -h 數組 ets div system logs string轉byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes(str); byte[] byteArray

go語言string、int、int64互相轉換

cpp -m pbo boa strong http views tools mod [cpp] view plain copy #string到int int,err:=strconv.Atoi(string) #string到int64 int6

Go語言優勢劣勢

ide pan 語法糖 動態 速度 class 相對 img 並發編程 Go語言的優勢: 1.腳本化的語法;開發效率高,容易上手 2.靜態類型+編譯型,程序運行速度有保障;靜態類型+編譯型語言相對於動態類型+解釋型語言的效率高 3.原生的支持並發編程;降低開發

Go語言-概況安裝

機緣巧合,需要使用基於Go語言的開源專案,發現Go語言的開發效率和某些特性讓我的開發工作變得輕鬆不少,因此學習了一些Go語言的知識,在實際工作中也用Go寫了一點東西。 為節省時間,這裡摘要一些學習心得和實際體會,注重簡短易讀,方便快速瀏覽複習。 主要參考 《the way t

Golang黑科技之——string[]byte轉換

我們知道,相對於C語言,golang是型別安全的語言。但是安全的代價就是效能的妥協。 下面我們通過Golang中的“黑科技”來一窺Golang不想讓我們看到的“祕密”——string的底層資料。 通過reflect包,我們可以知道,在Golang底層,string和slice其實都是st

GO學習筆記——GO語言變數變數定義(5)

上一篇說完了GO語言的基本資料型別,這一篇就來說說怎麼定義各種不同型別的變數吧 GO語言中變數定義需要使用關鍵字var,並且GO語言中定義變數是和C++定義變數相反的,C++是變數型別在前,變數名在後;而GO是變數名在前,變數型別在後。這是它們之間在定義變數時最明顯的不同

Java stringint相互轉化

String 轉 int public class Main { public static void main(String []args) { //需注意的是,若是出現轉換中存在非數字字元,可能

Go語言併發並行學習筆記(一)

如果不是我對真正並行的執行緒的追求,就不會認識到Go有多麼的迷人。 Go語言從語言層面上就支援了併發,這與其他語言大不一樣,不像以前我們要用Thread庫 來新建執行緒,還要用執行緒安全的佇列庫來共享資料。 以下是我入門的學習筆記。 Go語言的goroutines

GO語言初識程式設計環境配置

2.怎麼配置GO語言開發環境 3.什麼是Beego beego是一個快速開發Go應用的http框架 要想使用4,要了解。 .什麼是Git : Git是一款免費、開源的分散式版本控制系統,用於敏

go語言基礎之複數型別

1、複數型別 示例1: package main //必須有一個main包 import "fmt" func main() { var t complex128 //宣告 t = 2.1 + 3.14i //賦值 fmt.Println("t = ", t) //

go語言string遍歷細節

/** * Created by Administrator on 13-12-18. */ package main import ( "fmt" "os" ) func main() { str := "hello, 世界" n := len(str)

mybatis引數StringInteger型別的判斷

mybatis寫update時,正常是set了值才會進行update操作,我們一般是這樣寫: <if test="sampleBatchNo != null and sampleBatchN

Go語言併發並行

首先,並行!=併發, 兩者是不同的 Go語言的goroutines、通道和死鎖 goroutine Go語言中有個概念叫做goroutine, 這類似我們熟知的執行緒,但是更輕。 以下的程式,我們序列地去執行兩次loop函式: func loo

java intbyte型別轉換的2種方法

int是四位元組,32位數。byte是一位元組,8位數。在日常的格式轉換中,我們只需要將byte型別資料前加括號加(int)即可轉換成int型別資料。但是最近接觸到一種全新的轉換方法,雖然得到的結果是相同的,但在某些特殊情況時會用到。 第一種方法(普通):

Java Stringbyte[]的相互轉換

String str1="Hello!"; 1.String->byte[] byte[] b=str1.getBytes(); 2.byte[]->String String s

Go語言中的值型別和引用型別

一、值型別和引用型別值型別:int、float、bool和string這些型別都屬於值型別,使用這些型別的變數直接指向存在記憶體中的值,值型別的變數的值儲存在棧中。當使用等號=將一個變數的值賦給另一個變