byte與string底層強轉

2021-10-03 01:23:27 字數 4771 閱讀 3083

用關鍵字進行強轉,底層會發生拷貝,兩個變數互不影響。

**示例:

s:=

"012345"

b:=byte

(s) s1:=

string

(b) fmt.

println

(s1)

b[0]=

'9' fmt.

println

(s1)

==

= run test_強轉

012345

012345

--- pass: test_強轉 (

0.00s)

pass

1 byte to string

go支援中文字元做為變數

func test_運用底層程式設計bytetostring

(t *testing.t)

s :=*(

*string

)(unsafe.

pointer

(&b)

) fmt.

println

(s)}

==

= run test_運用底層程式設計bytetostring存在的問題

1234

--- pass: test_運用底層程式設計bytetostring存在的問題 (

0.00s)

pass

存在問題

由於底層沒有copy,導致字串並不是常量。在常規理解中,字串一經生成,便不會改變,經底層強轉後字串變得可以改變。雖然用底層強轉效率變高,但是也產生了新問題。

func test_運用底層程式設計bytetostring存在的問題(t *testing.t)

s :=*(

*string

)(unsafe.

pointer

(&b)

) fmt.

println

(s) b[0]

='9'

fmt.

println

(s)}

==

= run test_運用底層程式設計bytetostring存在的問題

1234

9234

--- pass: test_運用底層程式設計bytetostring存在的問題 (

0.00s)

pass

2 string to byte

具體實現:

func

test_stringtobyte

(t *testing.t)

b :=*(

*[]byte

)(unsafe.

pointer

(&res)

) fmt.

println

(b)}

==

= run test_stringtobyte[49

505152]

--- pass: test_stringtobyte (

0.00s)

pass

存在問題

由於 stirng型別是常量,所以會儲存在程式的常量區,這裡面的資料是不容改動的,否則程式會崩潰。但我們將字串強轉成byte後,byte與string共享記憶體,byte可以進行修改操作是合理合規的,於是繞過了編譯器的檢查執行了常量區記憶體修改。

func test_stringtobyte存在問題(t *testing.t)

b :=*(

*[]byte

)(unsafe.

pointer

(&res)

) fmt.

println

(b) b[0]

='9'

}

==

= run test_stringtobyte存在問題[49

505152]

unexpected fault address 0x54a1d3

fatal error

: fault

[signal 0xc0000005 code=

0x1 addr=

0x54a1d3 pc=

0x4fe930

]goroutine 5

[running]

:runtime.

throw

(0x54a45a

,0x5

) c:

/go1.

12.4

/src/runtime/

panic.go

:617

+0x79 fp=

0xc00009ff08 sp=

0xc00009fed8 pc=

0x42e479

runtime.

sigpanic()

c:/go1.

12.4

/src/runtime/signal_windows.go:

236+

0x23c fp=

0xc00009ff38 sp=

0xc00009ff08 pc=

0x4404cc

prcitf/

go%e5%90%

84%e7%a7%

8d%e5%

8f%98

%e9%87%

8f%e5%b8%b8%e9%87%

8f%e7%b1%bb%e5%

9e%8b%e5%

9f%ba%e7%a1%

80%e7%

94%a8%e6%b3%95/

string

.test_stringtobyte存在問題(

0xc000094100

) d:

/go/src/prcitf/

go各種變數常量型別基礎用法/

string

/強轉_test.go:

56+0xb0 fp=

0xc00009ffa8 sp=

0xc00009ff38 pc=

0x4fe930

testing.

trunner

(0xc000094100

,0x554bb0

) c:

/go1.

12.4

/src/testing/testing.go:

865+

0xc7 fp=

0xc00009ffd0 sp=

0xc00009ffa8 pc=

0x4c27a7

runtime.

goexit()

c:/go1.

12.4

/src/runtime/asm_amd64.s:

1337

+0x1 fp=

0xc00009ffd8 sp=

0xc00009ffd0 pc=

0x459441

created by testing.

(*t)

.run

c:/go1.

12.4

/src/testing/testing.go:

916+

0x361

goroutine 1

[chan receive]

:testing.

(*t)

.run

(0xc000094100

,0x550293

,0x1d

,0x554bb0

,0x472d01

) c:

/go1.

12.4

/src/testing/testing.go:

917+

0x388

testing.runtests.

func1

(0xc000094000

) c:

/go1.

12.4

/src/testing/testing.go:

1157

+0x7f

testing.

trunner

(0xc000094000

,0xc00006be30

) c:

/go1.

12.4

/src/testing/testing.go:

865+

0xc7

testing.

runtests

(0xc0000044a0

,0x646220

,0x5

,0x5

,0x0

) c:

/go1.

12.4

/src/testing/testing.go:

1155

+0x2b0

testing.

(*m)

.run

(0xc000088000

,0x0

) c:

/go1.

12.4

/src/testing/testing.go:

1072

+0x169

main.

main()

_testmain.go:

50+0x145

process finished with exit code 1

go陣列與切片, byte轉string

陣列 同一種資料型別的固定長度序列 陣列的定義 var a len int 比如 var a 5 int 長度是陣列型別的一部分,因此,var a 5 int 和 var a 10 int 是不同的型別 func array var age1 5 int var age2 int var str 5...

string 與byte的轉換

string型別轉成byte byte bytearray system.text.encoding.default.getbytes str 反過來,byte轉成string string str system.text.encoding.default.getstring bytearray 其...

python3 中 byte 和string轉換

python3 中 byte 和string轉換 舉例,我要將byte轉換為string型別 一開始我是直接使用 a str b 但是發現結果並非我想要的那種,後來在網上發現了一篇寫的很好的文章 python 3中最重要的新特性可能就是將文字 text 和二進位制資料做了更清晰的區分。文字總是用un...