我有一个数组可以说 array x = A,B,C,D,E
我想使用切片函数从我的数组中取一个随机元素并存储它以供以后在新的var中使用
所以我得到一个新的变量即 var y= x.slice
但是我不想指定它从数组中取出哪个元素,我希望每次我如何随机化切片时它是随机的?
代码是:
package main
import (
"fmt"
"unsafe"
)
type Point struct {
x int
y int
}
func main() {
buf := make([]byte, 50)
fmt.Println(buf)
t := (*Point)(unsafe.Pointer(&buf))
t.x = 10
t.y = 100
fmt.Println(buf)
}
Run Code Online (Sandbox Code Playgroud)
运行它时,会发生运行时恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0xa pc=0x43dd4d]
Run Code Online (Sandbox Code Playgroud)
为什么?
例如输入:(类型:string)
"[156, 100, 713]"
Run Code Online (Sandbox Code Playgroud)
示例转换:(类型:切片int)
[156, 100, 713]
Run Code Online (Sandbox Code Playgroud) 例如:我想使用反射将切片的数据作为数组来操作它。
func inject(data []int) {
sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
dh := (*[len(data)]int)(unsafe.Pointer(sh.Data))
printf("%v\n", dh)
}
Run Code Online (Sandbox Code Playgroud)
此函数将发出编译错误,因为len(data)它不是常量。我该如何解决?
我实现了一个界面几何图形,并有一部分 [] 几何图形,
anything := []geometry{
rect{width: 3, height: 4, name: "rect"},
circle{radius: 5, name: "circle"},
}
Run Code Online (Sandbox Code Playgroud)
现在我想按名称对切片进行排序,更改切片中元素的顺序。我可以使用 getName 函数来获取名称。排序后,我希望它像切片一样
{circle{radius: 5, name: "circle"},rect{width: 3, height: 4, name: "rect"},}
Run Code Online (Sandbox Code Playgroud)
这是代码
package main
import (
"fmt"
"math"
"sort"
)
type geometry interface {
area() float64
perim() float64
getName() string
}
type rect struct {
width, height float64
name string
}
type circle struct {
radius float64
name string
}
func (r rect) area() float64 {
return r.width * r.height
}
func …Run Code Online (Sandbox Code Playgroud) 我用 Go 编写了一个程序,可以查找列表中的最小数字并且它可以工作。但是,我不太明白其中的逻辑。您能解释一下它是如何工作的吗?
package main
import "fmt"
func main() {
x := []int{
48, 96, 86, 68,
57, 82, 63, 70,
37, 34, 83, 27,
19, 97, 9, 17,
}
for i, num := range x {
if num < i {
fmt.Println(num)
}
}
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https://play.golang.org/p/Awuw2Th1g2V
输出:
9
Run Code Online (Sandbox Code Playgroud)
我教科书上的解决方案是不同的,我理解其中的逻辑。
我有两个切片或向量,我想添加它们,如Golang所示:
a := []byte{1, 2, 3}
b := []byte{4, 5, 6}
ab := append(a, b...)
ba := append(b, a...)
Run Code Online (Sandbox Code Playgroud)
我怎么能在Rust那样做呢?我发现了一些其他问题,例如:
但是,他们所有的最佳答案都是a += b,而不是ab = a + b.
let mut a = vec![1, 2, 3];
let mut b = vec![4, 5, 6];
a.append(&mut b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, []);
Run Code Online (Sandbox Code Playgroud)
或者是否有类似Vec::append(a, b)Rust 的功能?
我怎么能做这样的事情?
我试图将 astruct作为参数传递给Go 中的函数。
func handleEntityProperties(w http.ResponseWriter, r *http.Request) {
const sliceSize = 100
var entityProperties struct {
Instance string `json:"instance"`
Entities []struct {
Id string `json:"id"`
Properties map[string]string `json:"properties"`
Type string `json:"type"`
} `json:"entities"`
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
if !json.Valid([]byte(body)) {
fmt.Fprintf(w, "invalid json")
return
}
err = json.Unmarshal(body, &entityProperties)
sendData(entityProperties.Entities[0:100])
return
}
func sendData(entities struct) {
log.Println("Doing things with entities ", entities)
}
Run Code Online (Sandbox Code Playgroud)
正如您在代码中看到的,我试图将 的前 100 个元素发送entityProperties.Entities …
这是一个非常微不足道的问题,但我在这里找不到它。对不起,如果我错过了。
我可以计算切片中的顺序始终是该切片中元素的插入顺序吗?我使用以下代码对其进行了测试:
func main() {
for i := 0; i < 10000; i++ {
testOrder()
}
}
func testOrder() {
sl := []int{}
for i := 0; i < 50; i++ {
sl = append(sl, i)
}
for i, el := range sl {
if el != i {
panic("Order not quaranteed")
}
}
}
Run Code Online (Sandbox Code Playgroud)
用数字填充切片,然后检查切片中元素的顺序是否与它们在其中填充的顺序相同。我做这个检查 10000 次。
我编写了一些代码,其中函数f将切片s作为参数并修改它而不返回它。
由于切片可以被视为对底层数组的引用,因此我认为切片实际上会在该函数的范围之外进行修改,但事实并非如此。
下面的代码就是一个例子(https://play.golang.org/p/Y5JUmDtRXrz)。
package main
import (
"fmt"
)
func pop(s []int) int {
first, s := s[0], s[1:]
return first
}
func main() {
s := []int{0, 1, 2, 3}
first := pop(s)
fmt.Println(first, s)
}
Run Code Online (Sandbox Code Playgroud)
pop(s)实际上返回0,这是预期的。但在输出中s仍然有0第一个元素。
0 [0 1 2 3]
Program exited.
Run Code Online (Sandbox Code Playgroud)
为什么?我该如何解决这个问题?