reflect: add Bytes()
Этот коммит содержится в:
		
							родитель
							
								
									12e3d1d81d
								
							
						
					
					
						коммит
						d98c0afbab
					
				
					 2 изменённых файлов: 52 добавлений и 1 удалений
				
			
		|  | @ -378,7 +378,27 @@ func (v Value) String() string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (v Value) Bytes() []byte { | func (v Value) Bytes() []byte { | ||||||
| 	panic("unimplemented: (reflect.Value).Bytes()") | 	switch v.Kind() { | ||||||
|  | 	case Slice: | ||||||
|  | 		if v.typecode.elem().Kind() != Uint8 { | ||||||
|  | 			panic(&ValueError{Method: "Bytes", Kind: v.Kind()}) | ||||||
|  | 		} | ||||||
|  | 		return *(*[]byte)(v.value) | ||||||
|  | 
 | ||||||
|  | 	case Array: | ||||||
|  | 		v.checkAddressable() | ||||||
|  | 
 | ||||||
|  | 		if v.typecode.elem().Kind() != Uint8 { | ||||||
|  | 			panic(&ValueError{Method: "Bytes", Kind: v.Kind()}) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Small inline arrays are not addressable, so we only have to | ||||||
|  | 		// handle addressable arrays which will be stored as pointers | ||||||
|  | 		// in v.value | ||||||
|  | 		return unsafe.Slice((*byte)(v.value), v.Len()) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	panic(&ValueError{Method: "Bytes", Kind: v.Kind()}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (v Value) Slice(i, j int) Value { | func (v Value) Slice(i, j int) Value { | ||||||
|  |  | ||||||
|  | @ -169,6 +169,37 @@ func TestSlice(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestBytes(t *testing.T) { | ||||||
|  | 	s := []byte("abcde") | ||||||
|  | 	refs := ValueOf(s) | ||||||
|  | 
 | ||||||
|  | 	s2 := refs.Bytes() | ||||||
|  | 
 | ||||||
|  | 	if !equal(s, s2) { | ||||||
|  | 		t.Errorf("Failed to get Bytes(): %v != %v", s, s2) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Copy(refs, ValueOf("12345")) | ||||||
|  | 
 | ||||||
|  | 	if string(s) != "12345" { | ||||||
|  | 		t.Errorf("Copy()=%q, want `12345`", string(s)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// test small arrays that fit in a pointer | ||||||
|  | 	a := [3]byte{10, 20, 30} | ||||||
|  | 	v := ValueOf(&a) | ||||||
|  | 	vslice := v.Elem().Bytes() | ||||||
|  | 	if len(vslice) != 3 || cap(vslice) != 3 { | ||||||
|  | 		t.Errorf("len(vslice)=%v, cap(vslice)=%v", len(vslice), cap(vslice)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i, got := range vslice { | ||||||
|  | 		if want := (byte(i) + 1) * 10; got != want { | ||||||
|  | 			t.Errorf("vslice[%d]=%d, want %d", i, got, want) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func equal[T comparable](a, b []T) bool { | func equal[T comparable](a, b []T) bool { | ||||||
| 	if len(a) != len(b) { | 	if len(a) != len(b) { | ||||||
| 		return false | 		return false | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Damian Gryski
						Damian Gryski