dongxiaowei_1234 2019-03-12 14:03 采纳率: 0%
浏览 20

从函数设置结构域

I'm sure there is a better way to do this, and I understand it's simple but I am new to go so bear with me. I am trying to set the fields of a struct (playersObject) from two functions (setCalculations and Calculations), more specifically, I am passing in values of two arrays (playerData and playerData2 from main to those functions, performing calculations in those functions, and want to return the values so that they can be set within the struct.

package main
import (
    "fmt"
    "os"
    "log"
    "strings"
    "bufio"
    "strconv"
)

type playersObject struct {

        firstname, lastname string
        batting_average, slugging_percentage, OBP, teamaverage float64
    }


func strToFloat(playerData []string, playerData2 []float64) []float64 {

        for _, i := range playerData[2:] {
            j, err := strconv.ParseFloat(i, 64)
            if err != nil {
                panic(err)
            }
            playerData2 = append(playerData2, j)
        }
        return playerData2
}

func (player *playersObject) setCalculations (playerData []string, playerData2 []float64)  {

    player.firstname = playerData[1]
    player.lastname = playerData[0]
    player.batting_average = (playerData2[2] + playerData2[3] + playerData2[4] + playerData2[5]) / (playerData2[1])
    player.slugging_percentage = ((playerData2[2]) + (playerData2[3]*2) + (playerData2[4]*3) + (playerData2[5]*4) )/(playerData2[1])
    player.OBP = (( playerData2[2] + playerData2[3] + playerData2[4] + playerData2[5] +playerData2[6] +playerData2[7])/ (playerData2[0]))

}

func (player *playersObject) Calculations () (string, string, float64, float64, float64, ) {

    return player.firstname, player.lastname, player.batting_average, player.slugging_percentage, player.OBP
}


func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter file name: ")
    fileName, err := reader.ReadString('
')
        if err != nil {
            log.Fatalf("failed opening file: %s", err)
        }
    fileName = strings.TrimSuffix(fileName, "
")

    //fmt.Printf("%q
", fileName)
    file, err := os.Open(fileName)
       scanner := bufio.NewScanner(file)
       scanner.Split(bufio.ScanLines)
       var fileOfPlayers []string

       for scanner.Scan() {
           fileOfPlayers = append(fileOfPlayers, scanner.Text())
       }

       file.Close()


      // var total_Average_sum float64 = 0
       var countofplayers float64 = 0
       //var total_average float64 = 0
       for _, player := range fileOfPlayers {
        countofplayers ++
        playerData := strings.Split(player, " ")
        var playerData2 = []float64{}
        playerData2 = strToFloat(playerData, playerData2)

        player := playersObject{}
        player.setCalculations(playerData, playerData2)

        calcs := player.Calculations()

        fmt.Println(firstname, lastname, batting_average, slugging_percentage, OBP)

    }
}

I recieve the errors multiple-value player.Calculations() in single-value contextand undefined: firstname, lastname, batting_average, slugging_percentage, OBP

I know this is very incorrect but again I am new to go and OOP. If this can be done in any simpler way I am open to it and appreciate all help and tips. Thank you

  • 写回答

1条回答 默认 最新

  • dongmu2517 2019-03-12 14:18
    关注

    Here, the error is thrown because Calculations() returns multiple values but you are trying to assign it to a single variable.

    You need to change the player.Calculations() method invocation from

        calcs := player.Calculations()
    

    to

    firstname, lastname, batting_average, slugging_percentage, OBP := player.Calculations()
    

    Having said that I would recommend you to read more about golang may be here. You need to re-write the code in view of go best practises

    评论

报告相同问题?