Skip to content

Instantly share code, notes, and snippets.

@chaosmatrix
Last active August 12, 2023 14:16
Show Gist options
  • Save chaosmatrix/bc4a3d423273becbda3657102a12c5cd to your computer and use it in GitHub Desktop.
Save chaosmatrix/bc4a3d423273becbda3657102a12c5cd to your computer and use it in GitHub Desktop.
golang tips

check file permission bits

// executable
if stat, err := os.Stat(filename); err != nil {
  panic(err)
}
if stat.Mode().Perm() & 0111 == 0000 {
  fmt.Printf("%s not executable\n", filename)
}
@chaosmatrix
Copy link
Author

net/netip

package main

import (
	"fmt"
	"net/netip"
)

func main() {

	ts := []string {
        "2001:db8::68",
        "8.8.8.8",
        "::ffff:808:808",
        "0:0:0:0:0:ffff:0808:0808",
        "0000:0000:0000:0000:0000:ffff:0808:0808",
    }
    for _, s := range ts {
		addr, err := netip.ParseAddr(s)
		if err == nil {
			fmt.Printf("ip: %s, is_ipv4: %v, is_ipv4Toipv6: %v, is_ipv6: %v, string: %s\n", s, addr.Is4(), addr.Is4In6(), addr.Is6(), addr.String())
		} else {
			fmt.Printf("[+] invalid ip %s\n", s)
		}
	}
}

Output:

ip: 2001:db8::68, is_ipv4: false, is_ipv4Toipv6: false, is_ipv6: true, string: 2001:db8::68
ip: 8.8.8.8, is_ipv4: true, is_ipv4Toipv6: false, is_ipv6: false, string: 8.8.8.8
ip: ::ffff:808:808, is_ipv4: false, is_ipv4Toipv6: true, is_ipv6: true, string: ::ffff:8.8.8.8
ip: 0:0:0:0:0:ffff:0808:0808, is_ipv4: false, is_ipv4Toipv6: true, is_ipv6: true, string: ::ffff:8.8.8.8
ip: 0000:0000:0000:0000:0000:ffff:0808:0808, is_ipv4: false, is_ipv4Toipv6: true, is_ipv6: true, string: ::ffff:8.8.8.8

@chaosmatrix
Copy link
Author

chaosmatrix commented Aug 4, 2023

time.Timer vs time.Ticker

Diff:

  1. Timer need to Reset every time when it fired
  2. Ticker auto reset every time when it fired

Warning:

  1. when the job wast more than ticker duration, there might has more than one job executed or lose some ticker

The difference of them show as code

// timer
for {
    time.Sleep(d)
    do_some_thing
    // timer reset
}

// ticker
for {
    time.Sleep(d)
    go func() {
        do_some_thing
    }()
   // wait next ticker
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment