用關鍵字進行強轉,底層會發生拷貝,兩個變數互不影響。
**示例:
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...