我有一块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 *[]student
,range *s
,s []student
,s *[]*student
时,我一直收到错误......很难让它正确...
对不起我的NEWBIE问题,还在学习GO ...努力尝试
答案 0 :(得分: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})
答案 1 :(得分:1)
在Go中你可以按值([]学生)或参考([] *学生)传递项目。如果要对struct{}
的值进行操作,则应将其传递给具有引用(指针)的函数。
所以你可以这样做:
type student struct {
name string
age int
}
func addTwoYearsToAll(students []*student){
for _, s := range students {
s.age += 2
}
}
这样您就可以使用在追加切片时构建的相同项目。 Playground example