如何将struct切片作为指针传递给函数并修改它?

问题描述 投票:1回答:2

我有一块struct []student,我想用函数修改它的内容。

type student struct {
    name string
    age int
}

students := []student{
    {"Doraemon", 30},
    {"King Kong", 25},
}

因此,我决定将它作为指针传递。我可以知道如何传递切片作为函数的引用吗?

func addAge (s *[]student) error { //this code has error
    //everyone add 2 years old
    for i, e := range *s {
        s[i].age = s[i].age + 2
    }
    //make the first student much older
    s[0].age = s[0].age + 5
    return nil
}

我一直在玩Go Playground,但它给了很多抱怨,比如

cannot range over s (type *[]student)
invalid operation: s[i] (type *[]student does not support indexing)
invalid indirect of s
...

如何精确地将slice of struct的引用传递给函数?如何区分结构的片段?以及如何更改结构的值(修改THE切片中的相同结构)?

我在玩s *[]studentrange *ss []students *[]*student的时候一直都会犯错...很难让它变得正确......

对不起我的NEWBIE问题,还在学习GO ......努力

go
2个回答
2
投票

切片通过引用传递,因此只要您修改现有切片内容,就不应显式传递指针。

package main

import (
    "fmt"
)

type student struct {
    name string
    age int
}

func main() {
    students := []student{
        {"Doraemon", 30},
        {"King Kong", 25},
    }

    err := addAge (students)

    fmt.Println(students)
    if err != nil {
        fmt.Println("error")
    }
}

func addAge (s []student) error {
    for i, _ := range s {
        s[i].age = 3
    }
    return nil
}

现在,对于你的addAdditinalStudent函数,你应该使用append函数。另外,请记住

...,由于切片标头始终通过追加调用进行更新,因此您需要在调用后保存返回的切片。实际上,编译器不会让你在不保存结果的情况下调用append。 Slices#append

// add student
students = append(students, student{"Test", 33})

Go Playground


1
投票

在Go中,您可以按值([]学生)或通过引用([] * student)传递项目。当你想对struct{}的值进行操作时,你应该将它传递给一个带有引用(指针)的函数。

所以你可以这样做:

type student struct {
    name string
    age int
}

func addTwoYearsToAll(students []*student){
  for _, s := range students {
        s.age += 2
     }
}

这样,您可以使用在追加切片时构建的相同项目。 Playground example

还可以看看Are Golang function parameter passed as copy-on-write?

© www.soinside.com 2019 - 2024. All rights reserved.