use 'flag' to make a cli app

package main

import (
	"flag"
	"fmt"
	"os"
)

func main() {
	age := flag.Int("age", 0, "Input age [int]")
	ifAdult := flag.Bool("isAdult", false, "default is false, set true ifAdult")
	var ip string
	flag.StringVar(&ip, "ip", "", "input ip : 192.168.1.1:1080")
	flag.Parse()
	rests := flag.Args()

	test := os.Args
	fmt.Println(*age, ifAdult, ip)
	fmt.Println(test)
	fmt.Println(rests)
}
/*
F:\Coding\letsgo\5_开源学go\flag>main.exe -age 12 -ip "192.168.2.135:10809" "testes" "12345"
12 0xc0000a60d0 192.168.2.135:10809
[main.exe -age 12 -ip 192.168.2.135:10809 testes 12345]
[testes 12345]
*/

There are two ways to get params, one is using flag.TYPE(), you will get param’s pointer; Another is using a var bind to falg.TYPEVar, you will get parm directly.

use bufio reduce io times

func reply(rd io.Reader, wd io.Writer) {
	reader := bufio.NewReader(rd)
	w := bufio.NewWriter(wd)
	defer w.Flush()
	for {
		msg, _, err := reader.ReadLine()
		if err != nil {
			// means that reach at EOF
			break
		}
		w.Write([]byte(msg))
		// w.Flush()
	}
}

func main() {
	filer, err := os.Open("read.txt")
	if err != nil {
		fmt.Printf("err occur while open file : %v \n", err)
	}
	defer filer.Close()
	filew := checkIfExistAndCreate("write.txt")
	defer filew.Close()
	reply(filer, filew)
}

use bufio to implement a read/write buffer to reduce io read/write times.

check if file exist and create it

func checkIfExistAndCreate(filename string) *os.File {
	_, err := os.Stat(filename)
	var filew *os.File
	if os.IsNotExist(err) {
		filew, _ = os.Create(filename)
	} else {
		filew, err = os.Open(filename)
		if err != nil {
			fmt.Printf("err occur while open file : %v \n", err)
		}
	}
	return filew
}

func main() {
    filew := checkIfExistAndCreate("write.txt")
	defer filew.Close()
}

How to merge two dicts in python

d1={"A": 10, "B": 20 }
d2={"B": 30, "C": 40}

d3={**d1, **d2}
print(d3)

# result is {'A': 10, 'B': 30, 'C': 40}

notice that the value of key B is 30.

use 'defer' to release resources before return

func getUser() (User, error) {
    resp, err := http.Get("https://example.tld/users")
    if err != nil{
        return User{}, err
    }

    dat, err := io.ReadAll(resp.Body)
    if err != nil {
        resp.Body.Close()  // you need to close it each time
        return err
    }

    user := User{}
    err = json.Unmarshal(dat, &user)
    resp.Body.Close()   // you need to close it each time
    return user, err
}

// By defer, you can do this
func getUser() (User, error) {
    resp, err := http.Get("https://example.tld/users")
    if err != nil{
        return User{}, err
    }
    defer resp.Body.Close()  // just set once, it will auto run later   

    dat, err := io.ReadAll(resp.Body)
    if err != nil{
        return err
    }

    user := User{}
    err = json.Unmarshal(dat, &user)
    return user, err
}

defer is a LIFO(last in first out) stack, it will run after the current function is run over . Notice that it run before return occured.

this snippet from here.