Go에서 바이트 슬라이스([]byte)를 문자열로 변환하는 데 선호되는 방법은 다음과 같습니다.
<code class="go">var b []byte // fill b s := string(b)</code>
이 접근 방식은 성능이 중요한 상황에서 문제가 될 수 있는 바이트 슬라이스 복사를 용이하게 합니다.
그러나 이러한 시나리오에서는 안전하지 않은 변환을 고려할 수 있습니다.
<code class="go">var b []byte // fill b s := *(*string)(unsafe.Pointer(&b))</code>
안전하지 않은 변환의 결과
안전하지 않은 변환은 실제로 성능을 향상시킬 수 있지만 Go에서 문자열의 불변성 보장을 위반할 위험이 있습니다. 언어 사양에서 변경할 수 없을 것으로 예상하는 문자열을 수정하면 예기치 않은 동작이 발생할 수 있습니다. 다음은 몇 가지 잠재적인 결과입니다.
<code class="go">m := map[string]int{} b := []byte("hi") s := *(*string)(unsafe.Pointer(&b)) m[s] = 999 fmt.Println("Before:", m) b[0] = 'b' fmt.Println("After:", m) fmt.Println("But it's there:", m[s], m["bi"]) for i := 0; i < 1000; i++ { m[strconv.Itoa(i)] = i } fmt.Println("Now it's GONE:", m[s], m["bi"]) for k, v := range m { if k == "bi" { fmt.Println("But still there, just in a different bucket: ", k, v) } }</code>
문자열의 첫 번째 바이트를 'b'로 수정한 후에는 원래 키나 수정된 키를 사용하여 찾을 수 없게 됩니다. 그러나 수정된 문자열은 비록 다른 버킷에 있더라도 여전히 맵에 존재합니다.
위 내용은 ## Go에서 `[]byte`에서 `string`으로 `안전하지 않은` 변환을 피해야 하는 시기와 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!