将函数的返回值赋给Struct数组中的元素



我希望Struct数组具有稍后在代码中定义的Function的返回值。
在这里我定义一个结构体"数组"和信息结构体数组的值,我希望信息数组中的每个元素有各自的价值观我提到,info.pos应该字符串的值我通过函数PossibleMoves(), info.bitrep应该有返回值的函数converttobit(), info.numrep应该toNumber()的返回值,和v1 v8应该moves[]数组的值,(v1=moves[0])。
我的代码确实很笨拙,有人能帮帮忙吗?

package main
import ("bufio"
    "fmt"
    "os"
  "strings")
 type array struct{
  pos string
  bitrep int64
numrep,v1,v2,v3,v4,v5,v6,v7,v8 int8
}
func main() {
file, err := os.Open("chessin.txt")
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    valid := []bool{}
    for scanner.Scan() {
        b := strings.Split(scanner.Text(), ",")
        valid = append(valid, isvalid(b))
    }
    fmt.Println(valid)
    info :=[64][11]array {
      info.pos = Possiblemoves(pos)
      info.bitrep=coverttobit(num)
       info.numrep=toNumber(string)
       info.v0=moves[0]
       info.v1=moves[1]
       info.v2=moves[2]
       info.v3=moves[3]
       info.v4=moves[4]
       info.v5=moves[5]
       info.v6=moves[6]
       info.v7=moves[7]
    }
}

func convertingtobit( num int){
  n := int64(num)
  bit:=strconv.FormatInt(n, 2)
}


func isvalid(b string) bool {
  if  b[0]<='H' && b[0]>='A' && b[1]<='8' && b[1]>='0' {
    return true
      }
  return false
}

func toNumber(s string) int {
    if len(s) != 2 {
       fmt.Println("Invalid Input",s,".") 
       } 
      num=int(s[0]-'A')*8 + int(s[1]-'0')
      return num
}
func PossibleMoves(a string) {
  isvalid := isvalid(a)
 if isvalid == true {
var moves [8]string
moves[0]=string(a[0]+1)+string(a[1]+2)
moves[1]=string(a[0]+1)+string(a[1]-2)
moves[2]=string(a[0]-1)+string(a[1]+2)
moves[3]=string(a[0]-1)+string(a[1]-2)
moves[4]=string(a[0]+2)+string(a[1]+1)
moves[5]=string(a[0]+2)+string(a[1]-1)
moves[6]=string(a[0]-2)+string(a[1]+1)
moves[7]=string(a[0]-2)+string(a[1]-1)
fmt.Println("Possible moves are : ",moves)
var PosMoves [8] int

  for i:=0;i<8;i++ {
    if isvalid == true {
    PosMoves[i]=toNumber(moves[i])
  }
}
fmt.Println("After converting : ",PosMoves)
   } else {
    fmt.Println("Invalid Input")
   }
}

简短回答(Compile: Success):

package main
import "fmt"
type array struct {
    pos                                    string
    bitrep                                 int64
    numrep, v1, v2, v3, v4, v5, v6, v7, v8 int8
}
func toNumber(s string) int8 {
    if len(s) != 2 {
        fmt.Println("Invalid Input", s, ".")
    }
    num := int8(s[0]-'A')*8 + int8(s[1]-'0')
    return num
}
func PossibleMoves(out *array, a string) {
    out.v1 = toNumber(string(a[0]+1) + string(a[1]+2))
}
func main() {
    info := &array{
        pos:    "A1",
        bitrep: 1,
    }
    PossibleMoves(info, "")
}

有一些问题:

1-在你的代码中使用:=代替=为新的变量:

func toNumber(s string) int {    
    if len(s) != 2 {
       fmt.Println("Invalid Input",s,".") 
       } 
      num=int(s[0]-'A')*8 + int(s[1]-'0')
      return num
}

像这样:

func toNumber(s string) int {
    if !isvalid(s) {
        panic("Invalid Input" + s + ".")
    }
    num := int(s[0]-'A')*8 + int(s[1]-'0')
    return num
}

2-你的代码:

func isvalid(b string) bool {
  if  b[0]<='H' && b[0]>='A' && b[1]<='8' && b[1]>='0' {
    return true
      }
  return false
}

检查len(b) == 2:

func isvalid(b string) bool {
    if len(b) == 2 && b[0] <= 'H' && b[0] >= 'A' && b[1] <= '8' && b[1] >= '1' {
        return true
    }
    return false
}

3-尽量不要复制粘贴:

moves[0]=string(a[0]+1)+string(a[1]+2)
moves[1]=string(a[0]+1)+string(a[1]-2)
moves[2]=string(a[0]-1)+string(a[1]+2)
moves[3]=string(a[0]-1)+string(a[1]-2)
moves[4]=string(a[0]+2)+string(a[1]+1)
moves[5]=string(a[0]+2)+string(a[1]-1)
moves[6]=string(a[0]-2)+string(a[1]+1)
moves[7]=string(a[0]-2)+string(a[1]-1)

准确回答问题:

type array struct{
  pos string
  bitrep int64
  numrep,v1,v2,v3,v4,v5,v6,v7,v8 int8
}
func PossibleMoves(out *array, a string) {
  out.v1 = tonumber(string(a[0]+1) + string(a[1]+2))
  // ...
}
func main() {
  // ...
  info := &array{
    pos: "...",
    bitrep: 1234,
  }
  PossibleMoves(info, line)
}

但是比起这个小细节,专注于@Amd的回答。

最新更新