골롱 절편 메커니즘을 깊이 이해하다
package main
import (
"fmt"
"unsafe"
)
type Slice struct {
ptr unsafe.Pointer // Array pointer
len int // slice length
cap int // slice capacity
}
// , int
// 32 int length = 4
// 64 int length = 8
var intLen = int(unsafe.Sizeof(int(0)))
func main() {
s := make([]int, 10, 20)
// slice memory
if intLen == 4 { // 32
m := *(*[4 + 4*2]byte)(unsafe.Pointer(&s))
fmt.Println("slice memory:", m)
} else { // 64
m := *(*[8 + 8*2]byte)(unsafe.Pointer(&s))
fmt.Println("slice memory:", m)
}
// slice Slice struct
slice := (*Slice)(unsafe.Pointer(&s))
fmt.Println("slice struct:", slice)
fmt.Printf("ptr:%v len:%v cap:%v
", slice.ptr, slice.len, slice.cap)
fmt.Printf("golang slice len:%v cap:%v
", len(s), cap(s))
s[0] = 0
s[1] = 1
s[2] = 2
//
arr := *(*[3]int)(unsafe.Pointer(slice.ptr))
fmt.Println("array values:", arr)
// slice len
slice.len = 15
fmt.Println("Slice len: ", slice.len)
fmt.Println("golang slice len: ", len(s))
}
// cap , array ptr
s := make([]int, 1)
fmt.Printf("len:%d cap: %d array ptr: %v
", len(s), cap(s), *(*unsafe.Pointer)(unsafe.Pointer(&s)))
for i := 0; i < 5; i++ {
s = append(s, i)
fmt.Printf("len:%d cap: %d array ptr: %v
", len(s), cap(s), *(*unsafe.Pointer)(unsafe.Pointer(&s)))
}
fmt.Println("Array:", s)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.