You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:50:46