如何使用 * 指针将数据附加到数组结构
How do you append data to array struct with * pointer
我正在学习 golang 的基础知识,我偶然发现了一些我可能缺乏理解的东西,这段代码工作正常:
package main
import (
"fmt"
)
type Category struct {
Id int
Name string
}
type Book struct {
Id int
Name string
Categories []Category
}
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
for i := 0; i < 10; i++ {
book.Categories = append(book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)
}
Output:
{1 Vanaraj [{10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj}]}
但是在 [] 类别上添加 * 指针会破坏程序
package main
import (
"fmt"
)
type Category struct {
Id int
Name string
}
type Book struct {
Id int
Name string
Categories *[]Category
}
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
for i := 0; i < 10; i++ {
book.Categories = append(book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)
}
Output:
./prog.go:26:27: first argument to append must be slice; have *[]Category
现在假设我无法从第二个代码块的 []Category 中删除 *(案例是导入一个包),我如何仍然像代码的第一个块一样附加数据,只添加我的 main() 函数的代码?
提前致谢
这与使用 int
值或 *int
指针相同。
var p *int
你必须先初始化它,例如使用内置 new()
:
p = new(int)
您分配给指向的值:
*p = 3
fmt.Println(*p)
指针切片也是如此:您首先必须对其进行初始化,例如使用内置 new()
:
book.Categories = new([]Category)
并且您使用 *
:
取消引用指针
*book.Categories = append(*book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
在 Go Playground 上试用。
请注意切片是切片 headers,它已经包含一个指向后备数组的指针。所以使用指向切片的指针是非常罕见的,通常是不需要的,只会使事情复杂化。
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
book.Categories = new([]Category)
for i := 0; i < 10; i++ {
*book.Categories = append(*book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)}
输出:{1 Vanaraj 0xc00000c030}
要打印类别,您可以使用 fmt.Println(book.Categories)
我正在学习 golang 的基础知识,我偶然发现了一些我可能缺乏理解的东西,这段代码工作正常:
package main
import (
"fmt"
)
type Category struct {
Id int
Name string
}
type Book struct {
Id int
Name string
Categories []Category
}
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
for i := 0; i < 10; i++ {
book.Categories = append(book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)
}
Output:
{1 Vanaraj [{10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj}]}
但是在 [] 类别上添加 * 指针会破坏程序
package main
import (
"fmt"
)
type Category struct {
Id int
Name string
}
type Book struct {
Id int
Name string
Categories *[]Category
}
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
for i := 0; i < 10; i++ {
book.Categories = append(book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)
}
Output:
./prog.go:26:27: first argument to append must be slice; have *[]Category
现在假设我无法从第二个代码块的 []Category 中删除 *(案例是导入一个包),我如何仍然像代码的第一个块一样附加数据,只添加我的 main() 函数的代码?
提前致谢
这与使用 int
值或 *int
指针相同。
var p *int
你必须先初始化它,例如使用内置 new()
:
p = new(int)
您分配给指向的值:
*p = 3
fmt.Println(*p)
指针切片也是如此:您首先必须对其进行初始化,例如使用内置 new()
:
book.Categories = new([]Category)
并且您使用 *
:
*book.Categories = append(*book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
在 Go Playground 上试用。
请注意切片是切片 headers,它已经包含一个指向后备数组的指针。所以使用指向切片的指针是非常罕见的,通常是不需要的,只会使事情复杂化。
func main() {
var book Book
book.Id = 1
book.Name = "Vanaraj"
book.Categories = new([]Category)
for i := 0; i < 10; i++ {
*book.Categories = append(*book.Categories, Category{
Id: 10,
Name: "Vanaraj",
})
}
fmt.Println(book)}
输出:{1 Vanaraj 0xc00000c030}
要打印类别,您可以使用 fmt.Println(book.Categories)