Go – Load data into three Struct using a common method

huangapple go评论78阅读模式
英文:

Go - Load data into three Struct using a common method

问题

我想使用一个方法(指针)将数据加载到三个结构体中,该方法解析一个文件。我对Go语言还不熟悉。

type a struct {
    a string
}

type b struct {
    b string
}

type c struct {
    c string
}

func main() {
    parse_file(filename)
}

// 在下面的方法中,*l不确定如何定义,以包含3个结构体
func (l *l) parse_file(filename string) {
    // 逐行打开文件
    // 如果行的值为a,则加载到结构体a中
    // 如果行的值为b,则加载到结构体b中
    // 如果行的值为c,则加载到结构体c中
}

以上是您提供的代码段的翻译。

英文:

I want to load data into three structs using a method(pointer) parsing a file. I am new to Go.

type a struct {
    a string
}

type b struct {
    b string
}

type c struct {
    c string
}

func main() {
    parse_file(filename)
}

//In below method, *l not sure how to define which can include 3 struct
func (l *l)parse_file(filename string) {
    // open a file line by line
    // if the line has value a then load into Struct a
    //If the line has value b then load into Struct b
    //If the line has value C then load into Struct c
}

答案1

得分: 1

你可以定义一个结构体,其中嵌入其他三个结构体。

看一下示例:

test.txt

a - This is A
b - This is B
c - This is C

代码

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

type a struct {
	a string
}

type b struct {
	b string
}

type c struct {
	c string
}

type l struct {
	a
	b
	c
}

func main() {

	l := &l{}
	filename := "test.txt"
	l.parse_file(filename)

	fmt.Println("A : ", l.a)
	fmt.Println("B : ", l.b)
	fmt.Println("C : ", l.c)
}

// 在下面的方法中,*l 不确定如何定义,以包含3个结构体
func (l *l) parse_file(filename string) {
	// 打开文件
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 逐行读取
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		switch {
		// 如果行的值为 a,则加载到结构体 a 中
		case strings.HasPrefix(line, "a -"):
			// 将数据添加到 a 对象中
			l.a = a{
				a: line,
			}

		// 如果行的值为 b,则加载到结构体 b 中
		case strings.HasPrefix(line, "b -"):
			// 将数据添加到 b 对象中
			l.b = b{
				b: line,
			}

		// 如果行的值为 c,则加载到结构体 c 中
		case strings.HasPrefix(line, "c -"):
			// 将数据添加到 c 对象中
			l.c = c{
				c: line,
			}
		}
	}
}


如果你想要移除前缀 a -b -c -,你可以使用 TrimPrefix 进行移除

line := strings.TrimPrefix(line, "a -")
英文:

You can define a struct which embed the other 3 struct

See the sample

test.txt

a - This is A
b - This is B
c - This is C

Code

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

type a struct {
	a string
}

type b struct {
	b string
}

type c struct {
	c string
}

type l struct {
	a
	b
	c
}

func main() {

	l := &l{}
	filename := "test.txt"
	l.parse_file(filename)

	fmt.Println("A : ", l.a)
	fmt.Println("B : ", l.b)
	fmt.Println("C : ", l.c)
}

// In below method, *l not sure how to define which can include 3 struct
func (l *l) parse_file(filename string) {
	// open a file
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// read line by line
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		switch {
		// if the line has value a then load into Struct a
		case strings.HasPrefix(line, "a -"):
			// add the data to the a object
			l.a = a{
				a: line,
			}

		//If the line has value b then load into Struct b
		case strings.HasPrefix(line, "b -"):
			// add the data to the b object
			l.b = b{
				b: line,
			}

		//If the line has value C then load into Struct c
		case strings.HasPrefix(line, "c -"):
			// add the data to the c object
			l.c = c{
				c: line,
			}
		}
	}
}


If you want to remove the prefix a - , b - or c -, then you can remove it with TrimPrefix

line := strings.TrimPrefix(line, "a -")

huangapple
  • 本文由 发表于 2023年7月4日 14:37:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/76609926.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定