Загружаем каталог…
Загружаем каталог…
키워드 json , marshal , unmarshal Marshal은 Go 데이터를 JSON으로 바꾼다. Unmarshal은 JSON을 Go 데이터로 되돌린다. go 에서 파일입출력을 해보니 많은걸 처리를 해준다. 그리고 문법은 단순하지만 기능은 단순하지 않은것 같다. 특히 파일의 입출력에서 발생하는 문제들 c 언어에서는 filepointer 를 가지고 이동 했지만 지금 까지 내가 배운 go에서는 c 언어보다는 추상화를 했지만 오히려 복잡해 사용하기 어려운 느낌이 든다. c 언어는 많은 걸 null 이나 구조체로 오류를 처리하거나 매크로를 사용하는데 go 는 많은경우 nil 을 사용해서 err 를 처리한다. code -- package main import ( "bufio" "encoding/json" "errors" "fmt" "os" "strconv" "strings" ) type Task struct { ID int Title string Done bool } type Store struct { Tasks []Task NextID int } func (s *Store) Add(title string) (Task, error) { task := strings.TrimSpace(title) if task == "" { return Task{}, errors.New("title is empty") } s.NextID++ tmp := Task{ ID: s.NextID, Title: task, Done: false, } s.Tasks = append(s.Tasks, tmp) return tmp, nil } func (s *Store) Complete(id int) error { for i := 0; i < len(s.Tasks); i++ { if s.Tasks[i].ID == id { s.Tasks[i].Done = true fmt.Println(s.Tasks[i]) return nil } } return errors.New("No match ID check again") } func split_token(scan *bufio.Scanner) ([]string, error) { if scan.Scan() { text := scan.Text() reValue := strings.TrimSpace(text) for i := 0; i < len(reValue); i++ { b := reValue[i] if isASCIIAlpha(b) == false { return []string{reValue[:i], reValue[i:]}, nil } } return []string{reValue}, nil } return nil, errors.New("Scanning Error Checkagain") } func (s *Store) Done(str string) error { number, err := strconv.Atoi(strings.TrimSpace(str)) if err != nil { return errors.New("AtoiError") } for i := range s.Tasks { if s.Tasks[i].ID == number { s.Tasks[i].Done = true return nil } } return errors.New("not found ID") } func isASCIIAlpha(b byte) bool { return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') } func newStore() *Store { return &Store{NextID: 0} } func (s *Store) print_list() { for _, task := range s.Tasks { fmt.Println(task) } } func (s *Store) Save(path string) error { store, err := load(path) if err != nil { return err } for _, task := range store.Tasks { s.Add(task.Title) } data, err := json.Marshal(s) if err := os.WriteFile(path, data, 0664); err != nil { return err } return nil } func load(path string) (*Store, error) { data, err := os.ReadFile(path) if os.IsNotExist(err) { store := &Store{} data, err := json.Marshal(store) if err != nil { return nil, err } if err := os.WriteFile(path, data, 0644); err != nil { return nil, err } return store, nil } if len(strings.TrimSpace(string(data))) == 0 { return newStore(), nil } var store Store if err := json.Unmarshal(data, &store); err != nil { return nil, err } return &store, nil } func main() { store := newStore() Scanner := bufio.NewScanner(os.Stdin) for { if text, err := split_token(Scanner); err == nil { switch text[0] { case "add": if len(text) == 2 { store.Add(text[1]) } else { fmt.Println("add command is : add <title>") } case "list": store.print_list() case "done": if len(text) == 2 { if err := store.Done(text[1]); err != nil { fmt.Println(err) } } else { fmt.Println("add command is : add <title>") } case "exit": fmt.Println("good bye sir") return case "save": if err := store.Save("./tasks.json"); err != nil { fmt.Println(err) return } else { fmt.Println("Good save") } case "": continue default: fmt.Println("Command type is ADD, list , exit") } } else { fmt.Println(err) } } } /* store 에 save 명령어 추가 같은 공간에서 같은 파일 읽기 파일이 없으면 첫시작 NextID 1 로 취급 성공시 메세지 출력 에러처리 - json 파싱 불가 - 읽기 실패 -> 이유를 출력후 프로그램 종료 - 저장 불가 -> 이유를 출력 */ 참조 https://go.dev/doc/tutorial/json
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
go를 배워보자(4). 키워드 json , marshal , unmarshal Marshal은 Go 데이터를 JSON으로 바꾼다. Unmarshal은 JSON을 Go 데이터로 되돌린다. go 에서 파일입출력을 해보니 많은걸 처리를 해준다. 그리고 문법은 단순하지만 기능은 단순하지 않은것 같다. 특히 파일의 입출력에서 발생하는 문제들 c 언어에서는 filepointer 를 가지고 이동 했지만 지금 까지 내가 배운 go에서는 c 언어보다는 추상화를 했지만 오히려 복잡해 사용하기 어려운 느낌이 든다. c 언어는 많은 걸 null 이나 구조체로 오류를 처리하거나 매크로를 사용하는데 go 는 많은경우 nil 을 사용해서 err 를 처리한다. code -- package main import ( "bufio"…
Открыть источник