Go语言中printInfo无法读取结构体字段的问题及修复方法
问题与修复:Go语言结构体切片赋值异常问题
问题描述
期望输出:
Word: go Page 8 Num of pages 34
实际运行输出:Number of words: 1 Enter word: go Enter page: 8 Enter num of pages: 34 Word: Page: 0 Num of pages: 0程序退出码为0,疑问:为何
printInfo方法无法读取结构体的字段?请修复该问题。
附原代码:
package main import "fmt" type Word struct { word string page, numOfPage int } func (obj *Word) printInfo() { fmt.Printf("Word: %v\n", obj.word) fmt.Printf("Page: %v\n", obj.page) fmt.Printf("Num of pages: %v\n", obj.numOfPage) } func inputInfo(obj *Word) { var ( word string page, numOfPage int ) fmt.Println("Enter word: ") fmt.Scan(&word) fmt.Println("Enter page: ") fmt.Scan(&page) fmt.Println("Enter num of pages: ") fmt.Scan(&numOfPage) obj.page = page obj.word = word obj.numOfPage = numOfPage } func main() { var n int fmt.Println("Number of words: ") fmt.Scan(&n) slc := make([]Word, n) for _, elem := range slc { inputInfo(&elem) } for _, elem := range slc { elem.printInfo() } }
问题根源
遍历切片slc时,for _, elem := range slc中的elem是切片元素的副本,并非原切片内的元素本身。调用inputInfo(&elem)时,修改的只是这个副本的内容,原切片里的元素完全没被改动,所以最终打印的是结构体的初始零值(空字符串、0)。
修复代码
通过遍历切片索引,直接操作原切片元素的指针,确保修改的是原切片内的元素:
package main import "fmt" type Word struct { word string page, numOfPage int } func (obj *Word) printInfo() { fmt.Printf("Word: %v\n", obj.word) fmt.Printf("Page: %v\n", obj.page) fmt.Printf("Num of pages: %v\n", obj.numOfPage) } func inputInfo(obj *Word) { var ( word string page, numOfPage int ) fmt.Println("Enter word: ") fmt.Scan(&word) fmt.Println("Enter page: ") fmt.Scan(&page) fmt.Println("Enter num of pages: ") fmt.Scan(&numOfPage) obj.page = page obj.word = word obj.numOfPage = numOfPage } func main() { var n int fmt.Println("Number of words: ") fmt.Scan(&n) slc := make([]Word, n) // 遍历索引,直接操作原切片元素 for i := range slc { inputInfo(&slc[i]) } for _, elem := range slc { elem.printInfo() } }
修复说明
- 将遍历方式从
for _, elem := range slc改为for i := range slc,通过&slc[i]获取原切片中第i个元素的指针,传入inputInfo后修改的就是原元素的值。 - 后续遍历打印时,就能正确读取到输入的内容,符合预期输出。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

