У меня есть некоторые значения в списке в Go. Мне просто нужно иметь возможность их распечатать, но каждый раз, когда я пытаюсь, он сообщает мне, что test.FirstName undefined (тип * list.Element не имеет поля или метода FirstName).
Итак, как мне правильно получить доступ к членам списка? Последние две строчки меня смущают.
package main
import (
"bufio"
"fmt"
"log"
"strconv"
"strings"
"os"
"container/list"
)
type Student struct {
FirstName string
LastName string
testScore int
homeworkScore int
}
func main() {
fmt.Println("What is the name of your file?\n")
var filename string
fmt.Scan(&filename)
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(file)
//var numLineCount int = 0
var gradeCount = 0
var student Student
var studentList list.List
var studentCount int = 1
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
student.FirstName = fields[0]
student.LastName = fields[1]
scanner.Scan()
line2 := scanner.Text()
sum := 0
gradeCount = 0
for _, field := range strings.Fields(line2) {
n, err := strconv.Atoi(field)
if err != nil {
log.Fatal(err)
}
gradeCount++
sum += n
}
student.testScore = sum/gradeCount
gradeCount = 0
scanner.Scan()
line3 := scanner.Text()
sum2 := 0
for _, field := range strings.Fields(line3) {
n, err := strconv.Atoi(field)
if err != nil {
log.Fatal(err)
}
gradeCount++
sum2 += n
}
student.homeworkScore = sum2/gradeCount
studentList.PushBack(studentCount)
studentCount++
fmt.Println("First:", student.FirstName, "Last:", student.LastName, "Test Avg:", student.testScore, "Homework Avg:", student.homeworkScore)
}
test:=studentList.Front()
fmt.Println(test.FirstName)
}
update: поэтому я понял, что не могу использовать test.FirstName в части println, просто Println(test) работает и печатает все. но мне все еще нужно иметь доступ к каждому элементу списка. Как я могу это сделать?
@hobbs, к сожалению, это задание, в котором мы должны использовать списки





Быстрое чтение кода. Вы помещаете studentCount в список, который является переменной int согласно вашему объявлению. Я думаю, что вы пытаетесь достичь вместо этого вставки структуры student. Опечатка?
P.S. Если это не домашнее задание или что-то с особыми требованиями, просто используйте фрагмент. Всегда используйте срез.
к сожалению, это для задания, в котором конкретно говорится об использовании списков. Спасибо за помощь! Я посмотрю, что я могу сделать из этого
теперь у меня есть test:=studentList.Front() fmt.Println(test) и его печать &{0xc0000644b0 0xc000064390 0xc000064390 {Chris Millsap 77 71}}
Похоже, у вас нет под рукой типа объекта. вы можете использовать утверждение, чтобы получить фактический тип объекта, что-то вроде следующего:
test:=studentList.Front()
if actualStudent, ok := test.Value.(Student); ok {
fmt.Println(actualStudent.FirstName)
}
Если это не поможет, пожалуйста, оставьте комментарий с проблемой, с которой вы столкнулись, и я буду более чем счастлив помочь вам.
Это дало мне неверное утверждение типа: test.(Student) (не интерфейсный тип *list.Element слева)
вместо этого используйте test.Value.(Student), пожалуйста, проверьте обновленный ответ
Упс, кажется, я случайно удалил эту часть перед тем, как запустить ее (это был долгий день). Кажется, это исправлено. Огромное спасибо
Вы нужно используете
containers/list? Вас кто-то просил? Это чисто из любопытства? Потому что это, наверное, очень плохая идея. Просто используйте кусочек.