go note

package main

import (
"crypto/md5"
"fmt"
"log"
"math"
"math/bits"
"math/rand"
"os"
"reflect"
"runtime"
"sort"
"strconv"
"strings"
"sync"
"te"
"time"
"unsafe"
//"hash"
"encoding/hex"
fstate "fsm"
"io"
"regexp"
"text/tabwriter"
"path/filepath"
"errors"
"context"
)

var c bool
var age int
var score float32
var tree, tree2 uint16
var list []uint

func main() {
// _, txt := addStr(1, "new")
// fmt.Println("Google" + "Runoob", txt)
// var man male
// fu := man.change(6,5)
// fmt.Println("===>>", fu())
//main1()
//te.When()
rand.Seed(time.Now().Unix())

randseed = time.Now().UnixNano()
mainfi()

}

const (
Unknown = "1123swerwe"
Female = len(Unknown)
Male = unsafe.Sizeof(Unknown)
Today = iota
Nice
)

func addStr(num int, str string) (a, b int) {
age = 1
newd := 1
body, newd := age, 1
age += body
arr := []int{1, 23, 34, 3, 63}
slice1 := make([]int, 5)
fmt.Println(Unknown, Female, Male, unsafe.Sizeof(arr), Today, Nice)
bload(arr)
for k, v := range slice1 {
fmt.Println(k, v)
}
const Length int = 1
return age, newd
}

func bload(arr []int) {
arr[len(arr)-1] = 999
}

type male struct {
body float32
}

func (c male) change(a, b int) func() int {
NCC:
if a >= b {
fmt.Println(a, "big")
a = a - 1
goto NCC
} else {
fmt.Println(a, "small")
}
return func() int {
a++
return a
}
}

// 定义一个 DivideError 结构
type DivideError struct {
dividee int
divider int
}

func (obj *DivideError) Div() {
obj.dividee = 10
obj.divider = 9
}

func (obj DivideError) Div1() {
obj.dividee = 100
obj.divider = 90
}

// 实现 error 接口
func (de *DivideError) Error() string {
strFormat := Cannot proceed, the divider is zero. dividee: %d divider: 0

return fmt.Sprintf(strFormat, de.dividee)

}

// 定义 int 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
if varDivider == 0 {
dData := DivideError{
dividee: varDividee,
divider: varDivider,
}
errorMsg = dData.Error()
return
} else {
return varDividee / varDivider, ""
}

}

func main1() {

if result, errorMsg := Divide(100, 10); errorMsg == "" {
	fmt.Println("100/10 = ", result)
}
// 当除数为零的时候会返回错误信息
if _, errorMsg := Divide(100, 0); errorMsg != "" {
	fmt.Println("errorMsg is: ", errorMsg)
}
chans()
maps()

var di DivideError
di.Div()
//fmt.Println("====>>>>", di.dividee, di.divider)

}

func worker(id int, c chan int) {
for {
fmt.Printf("worker %d run %c\n", id, <-c)
}
}

func chans() {
// var channels [10]chan int
// for i:=0;i<2;i++{
// channels[i]=make(chan int)
// go worker(i,channels[i])
// }
// for i:=0;i<10;i++{
// channels[0] <- 'a'+i
// }

// fmt.Println("=======>>>")
// for i:=0;i<10;i++{
//     channels[1] <- 'A'+i
// }

}

func maps() {
var contryMap map[string]string = make(map[string]string)
contryMap["nis"] = "nik"
contryMap["nid"] = "nikw"
contryMap["ni"] = "nikd"
for k, v := range contryMap {
fmt.Println(k, v)
}
fmt.Println("dd", contryMap["ni"+"s"])
fun(callback).call(2)
mains()
}

func mains() {
fmt.Printf(">>>>%T\n", 123)

type cat struct {
	Name string
	Type int `json:"type" id:"100"`
}
typeOfCat := reflect.TypeOf(cat{})
if catType, ok := typeOfCat.FieldByName("Type"); ok {
	fmt.Println(catType.Tag.Get("json"))
	fmt.Println(catType.Tag.Get("id"))
}
//main2()

main3()

}

//需要传递函数
func callback(i int) {
d := &i
fmt.Println("i am callBack", reflect.TypeOf(d))
fmt.Println(i)
}

//定义的type函数
type fun func(int)

//fun实现的Call接口的call()函数
func (f fun) call(i int) {
f(i)
}

//接口
// type Call interface {
// call(int)
// }

// 崩溃时需要传递的上下文信息
type panicContext struct {
functionss string // 所在函数
function int // 所在函数
}

// 保护方式允许一个函数
func ProtectRun(entry func()) {
//延迟处理的函数
defer func() {
// 发生宕机时,获取panic传递的上下文并打印
err := recover()
switch err.(type) {
case runtime.Error: // 运行时错误
fmt.Println("runtime error:", err)
default: // 非运行时错误
fmt.Println("error:", err)
}
}()
entry()
}
func main2() {
fmt.Println("运行前")
// 允许一段手动触发的错误
ProtectRun(func() {
fmt.Println("手动宕机前")
// 使用panic传递上下文
panic(&panicContext{
"手动触发panic",
555,
})
fmt.Println("手动宕机后")
})
// 故意造成空指针访问错误
ProtectRun(func() {
fmt.Println("赋值宕机前")
var a *int
*a = 1
fmt.Println("赋值宕机后")
})
fmt.Println("运行后")
}

type coder interface {
code()
debug()
}

type Gopher struct {
num int
language string
}

func (p Gopher) code() {
p.num++
fmt.Printf("I am coding %s language, num is %d\n", p.language, p.num)
}

func (p *Gopher) debug() {
p.num++
fmt.Printf("I am debuging %s language, num is %d\n", p.language, p.num)
}

func maintest() {
// var take coder
// take = &Gopher{100, "doing"}
// take.code()
// take.debug()
// take.code()

lsInt := make(chan int)
fmt.Println("6666666", time.Second)
count := 0
var lock sync.Mutex
go func() {
	for i := 0; i < 26; i++ {
		lock.Lock()
		count = count + 1
		fmt.Println("go<<<", i, count)
		lock.Unlock()
		lsInt <- i
	}

}()
go func() {
	for i := 0; i < 16; i++ {
		m := <-lsInt
		lock.Lock()
		count = count + 1
		fmt.Println("go>>>", m, count)
		lock.Unlock()
	}
}()
m := <-lsInt
lock.Lock()
count = count + 1
fmt.Println("main>>>", m, count)
lock.Unlock()
fmt.Println("zzzzz", count)

}

func mainos() {
// 预定义变量, 保存命令行参数
fmt.Println(os.Args)

// 获取host name
fmt.Println(os.Hostname())
fmt.Println(os.Getpid())

// 获取全部环境变量
// env := os.Environ()
// for k, v := range env {
// 	fmt.Println(k, v)
// }

// 终止程序
// os.Exit(1)

// 获取一条环境变量
//fmt.Println(os.Getenv("PATH"))

// 获取当前目录
dir, err := os.Getwd()
fmt.Println(dir, err)

// 创建目录
err = os.Mkdir(dir+"/new_file", 0755)
fmt.Println(err)

// 创建目录
err = os.MkdirAll(dir+"/new", 0755)
fmt.Println(err)

// 删除目录
err = os.Remove(dir + "/new_file")
err = os.Remove(dir + "/new")
fmt.Println(err)

// 创建临时目录
tmp_dir := os.TempDir()
fmt.Println(tmp_dir)

}

func findRoad(r *int) {
log.Println("road:", *r)
}
func entry() {
rd := int(999)
r := &rd
runtime.SetFinalizer(r, findRoad)
}

func main3() {
// entry()
// for i := 0; i < 3; i++ {
// time.Sleep(time.Second)
// runtime.GC()
// }
var x float64 = 3.4
//data := reflect.TypeOf(x)
value := reflect.ValueOf(x)
// floatData := value.Float()
// floatData = 1.3
over := value.Interface()
fmt.Println(reflect.TypeOf(over), reflect.TypeOf(over.(float64)), over, interface{}(interface{}(over)).(float64), interface{}(x).(float64))

return

}

func KeyPrefix(str interface{}) (prefix string) {
t := reflect.TypeOf(str).Elem()
prefix = fmt.Sprintf("%s_%s_", "india_game", t.String())
return
}

type pick struct {
str string
co int
}

type Person05 struct {
name string
sex string
age int
}

func (p Person05) printInfo() {
fmt.Printf("55>>名称:%s, 性别:%s, 年龄:%d\n", p.name, p.sex, p.age)
}

type inter interface {
printInfo()
}

type Person04 struct {
Person05
sex bool
name string
age int
}

func (p Person04) printInfo() {
fmt.Printf("44>>名称:%s, 性别:%s, 年龄:%d\n", p.name, p.sex, p.age)
}

type Student struct {
Person05
id int
}

func Float64bits(f float64) uint64 { return (uint64)(unsafe.Pointer(&f)) }

//func Float64bits(f, m float64){ return (uint64)(unsafe.Pointer(&f)) }

func init() {

}

func init() {

}

func main61() {
// str := "zzzzzz"
// m := KeyPrefix(&str)
// fmt.Println(m)
// picks := pick{}
// fmt.Println(&picks, &picks.co,&(picks.co), (&picks).co)

// user := pick{"go", 3}
// fmt.Printf("%v %v\n", user, &user)
// fmt.Printf("%+v %+v\n", user, &user)
// fmt.Printf("%#v %#v\n", user, &user)

// done := make(chan int, 1) // 带缓存通道
// go func() {
// 	fmt.Println(">>>>>1")
// 	<-done
// 	fmt.Println(">>>>>2")
// }()
// fmt.Println(">>>>>3")
// done <- 1
// fic.When(2)
// //fic2.When(3)

//fic.When(2)
// //fic2.When(3)
// fic2.Put()

// oldList := []int {1,2,3,4,5,6}
// i := 3
// fmt.Println(oldList[:1], oldList[i+1:])
// oldList = append(oldList[:i], oldList[i+1:]...)
// fmt.Println(oldList)

// x := []int {1,2,3}
// //注意下面这两个区别
// fmt.Println(append(x,4,5,6), x)
// if(fic.When == nil){
// 	fmt.Println("kkkkkkkk")
// }

// 	u := uint32(32)
// 	i := int32(1)
// 	fmt.Println(&u, &i)
// 	p := &i
// 	fmt.Println(">>",unsafe.Pointer(&u))
// 	p = (*int32)(unsafe.Pointer(&u))
// 	fmt.Println(*p)
// flo := 3.5
// fmt.Println(Float64bits(flo))

p := Person04{Person05{}, true, "putty", 10}

fmt.Println(p)
fmt.Println("SIZE", &(p), &(p.sex), &(p.name), &(p.age))
lang := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&p)) + 24))
*lang = 20
fmt.Println(p)

// var x struct {
// 	a bool
// 	b string
// 	c bool
// 	b1 bool
// 	c1 bool
// 	d int32
// 	e []int
// }
// fmt.Println("SIZE", &(x),&(x.a),&(x.b),&(x.c),&(x.b1),&(x.c1),&(x.d),&(x.e))
// //Alignof 返回 m,m 是指当类型进行内存对齐时,它分配到的内存地址能整除 m。
// //fmt.Println("ALIGN",unsafe.Alignof(x),unsafe.Alignof(x.a),unsafe.Alignof(x.b),unsafe.Alignof(x.c))
// fmt.Println("OFFSET",0, unsafe.Offsetof(x.a), unsafe.Offsetof(x.b), unsafe.Offsetof(x.c))

// recover()
// a := make([]func(), 3 )
// i := 0
// for ; i < 3; i++ {
//     a[i]= func( ){
//         fmt.Println(i)
// 	}

// }
// defer func(){ fmt.Println("Zzz")}()
// defer func(){ }()
// defer func(){ fmt.Println("Zzz2")}()
// panic("zjjj")

//i = 6
// for _, s := range a {
//     s()
// }

}

func main66() {
// defer func() {

//         fmt.Println(recover())
//         fmt.Printf(">>>%T", recover())
// }()

// fmt.Println(1, nil)
// a := []int{123}
// a[0] = 2

// maps := map[string]interface{}{}

// maps["student4"] = Person04
// maps["student5"] = student5

// fmt.Println("struct to string")
num := Person04{Person05{}, true, "putty", 10}

// if abs, ok := interface{}(num.name).(string); ok {
// 	fmt.Println("zzzzz", abs)
// }
num.printInfo()
v2 := reflect.ValueOf(num)
fmt.Println(">>", v2.Type())

// go func() {
// 	for {
// 	  fmt.Println("goroutine1_print")
// 	}
//   }()

//   // 协程B
//   go func() {
// 	time.Sleep(1 * time.Second)
// 	panic("goroutine2_panic")
//   }()

//   time.Sleep(20 * time.Second)

str := "LUCKY SPIN is wai@ting for YOU! Our players has won more than 1 Lakh totally in LUCKY SPIN today!Your city's player has won 2 Lakh in Poker today, come to WIN BIGGER!"
GetRandomStr(str)
// for i := 1; i< 80; i++ {
// 	fmt.Println(RandInt(3))
// }

x := 11
y := (1 << 0) | (1 << 3) //保证 z 中的第 0 位和第 3 位为 0
z := x &^ y
fmt.Printf("x = %b\n", x)
fmt.Println("\t&^")
fmt.Printf("y = %b\n", y)
fmt.Println("————————")
fmt.Printf("z = %04b\n", z)

}

func RandInt(max int) int {
if max <= 1 {
return 1
}
rr := rand.New(rand.NewSource(time.Now().UnixNano() * rand.Int63n(9999)))
return rr.Intn(max) + 1
}

//分隔符@
func GetRandomStr(str string) {
strLs := strings.Split(str, "@")
for k, str := range strLs {
fmt.Println(k, str)
}
fmt.Println(strLs[RandInt(len(strLs))-1])
}

const m0 = 0x5555555555555555 // 01010101 ...
const m1 = 0x3333333333333333 // 00110011 ...
const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
const m3 = 0x00ff00ff00ff00ff // etc.
const m4 = 0x0000ffff0000ffff

func P64(x uint64) {
str := ""
for i := 0; i < 64; i++ {
str = fmt.Sprint(x>>i&1, str)
}
fmt.Println(x, ">>>", str)
}

func P32(x uint64) {
str := ""
for i := 0; i < 32; i++ {
str = fmt.Sprint(x>>i&1, str)
}
fmt.Println(x, ">>>", str)
}

func P16(x uint64) {
str := ""
for i := 0; i < 16; i++ {
str = fmt.Sprint(x>>i&1, str)
}
fmt.Println(x, ">>>", str)
}

func onecnt(x uint64) int {
count := 0
for ; x > 0; x = x & (x - 1) {
count++
}
return count
}

func onetest(x uint64) {
const m = 1<<64 - 1
fmt.Println(x, x&m)

//var s te.StateStr

}

// func (x *StateStr)take() {

// }

func OnesCount64(x uint64) int {
const m = 1<<64 - 1
x = x>>1&(m0&m) + x&(m0&m)
x = x>>2&(m1&m) + x&(m1&m)

x = (x>>4 + x) & (m2 & m)
x += x >> 8
x += x >> 16
x += x >> 32
fmt.Println("==>", m0&m)

return int(x) & (1<<7 - 1)

}

func Abs(n float64) float64 {
return float64bits(bittofloat(n) &^ (1 << 63))
}

func float64bits(n uint64) float64 {
return (float64)(unsafe.Pointer(&n))
}

func bittofloat(n float64) uint64 {
return (uint64)(unsafe.Pointer(&n))
}

func GetFunctionName(i interface{}, seps ...rune) string {
// 获取函数名称
fmt.Println("**>>>>", runtime.FuncForPC(reflect.ValueOf(i).Pointer()))
fn := runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
// 用 seps 进行分割
fields := strings.FieldsFunc(fn, func(sep rune) bool {
for _, s := range seps {
if sep == s {
return true
}
}
return false
})

fmt.Println(fields)
if size := len(fields); size > 0 {
	return fields[size-1]
}
return ""

}

func Println(v uint64) {
P16(v)
}

func getlog(v uint32) uint32 {
v--
v |= v >> 1
v |= v >> 2
v |= v >> 4
v |= v >> 8
v |= v >> 16
v++
v = tab32[(v*0x077CB531)>>27]
return v
}

const digits = "0123456789abcdefghijklmnopqrstuvwxyz"

var tab32 = [32]uint32{
0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9}

func main106() {
uintSize := 32 << (^int64(0) >> 32 & 1)
b := 1e20
fmt.Println(^uint(0), ^uint(0)>>32, (^uint(0) >> 32 & 1), uintSize)

const m = 1<<64 - 1
fmt.Println(b, m>>1&(^int64(0)), OnesCount64(4095), onecnt(4096))
onetest(409)
P16(123)
P16(123 &^ 6)

fmt.Println("name:", GetFunctionName(P16))
// P64(bittofloat(-0.1251234))
// P64(bittofloat(-1))
var pi te.StateStr
pi.Fill()
curT := time.Now()
const sun = iota
fmt.Println(">>>", curT.Nanosecond(), sun, time.Now().UTC())

// 	const char g_math_32[] ={0,1,23,2,29,24,14,3,30,27,25,18,20,15,10,4,31,22,28,13,26,17,19,9,21,12,16,8,11,7,6,5};
// #define LOG2(v) g_math_32[(uint32_t)((v) * 0x7dcd629) >> 27]
fmt.Println(strconv.FormatInt(127, 2))
var un uint64 = 88
un = -un
string_number := 869702343
result := fmt.Sprint(string_number)
fmt.Println(result)
x := 0x077CB531
fmt.Println((x & -x))
fmt.Printf("%T\n", result)
fmt.Println("===", digits[1:2], un, bits.TrailingZeros(2), getlog(120), bits.LeadingZeros(1<<60+4641213))

slice := make([]byte, 0)
slice1 := strconv.AppendBool(slice, false)                 // []byte中添加bool类型 (bool-->[]byte)
fmt.Println(string(slice1))                                // false
slice2 := strconv.AppendInt(slice, 123, 2)                 // 2:二进制
fmt.Println(string(slice2))                                // 1111011
slice3 := strconv.AppendFloat(slice, 3.141592, 'f', 4, 64) // 4:保留4位。 64:float64
fmt.Println(string(slice3))                                // 3.1416
slice4 := strconv.AppendQuote(slice, "hello")
fmt.Println(string(slice4), reflect.ValueOf(slice3).Len()) // "hello" (包含双引号)
for k, v := range slice {
	fmt.Println(k, v)
}

}

func requiresQuotes(u string) bool {
// When type URL contains any characters except [0-9A-Za-z./-]*, it must be quoted.
for , ch := range u {
switch {
case ch == '.' || ch == '/' || ch == '
':
continue
case '0' <= ch && ch <= '9':
continue
case 'A' <= ch && ch <= 'Z':
continue
case 'a' <= ch && ch <= 'z':
continue
default:
return true
}
}
return false
}

func RandIntervalN(b1, b2 int32, n uint32) []int32 {

if b1 == b2 {
	return []int32{b1}
}

min, max := int64(b1), int64(b2)
if min > max {
	min, max = max, min
}
l := max - min + 1
if int64(n) > l {
	n = uint32(l)
}

r := make([]int32, n)
m := make(map[int32]int32)
for i := uint32(0); i < n; i++ {
	v := int32(rand.Int63n(l) + min)
	//v := int32(Getrand(min, max))
	if mv, ok := m[v]; ok {
		r[i] = mv
	} else {
		r[i] = v
	}

	lv := int32(l - 1 + min)
	if v != lv {
		if mv, ok := m[lv]; ok {
			m[v] = mv
		} else {
			m[v] = lv
		}
	}
	l--
}
return r

}

func RandGroup(p ...uint32) int {
if p == nil {
panic("args not found")
}

r := make([]uint32, len(p))
for i := 0; i < len(p); i++ {
	if i == 0 {
		r[0] = p[0]
	} else {
		r[i] = r[i-1] + p[i]
	}
}

rl := r[len(r)-1]
if rl == 0 {
	return 0
}

rn := uint32(rand.Int63n(int64(rl)))
for i := 0; i < len(r); i++ {
	if rn < r[i] {
		return i
	}
}

panic("bug")

}

func deepCopy(dst, src reflect.Value) {
switch src.Kind() {
case reflect.Interface:
value := src.Elem()
if !value.IsValid() {
return
}
newValue := reflect.New(value.Type()).Elem()
deepCopy(newValue, value)
dst.Set(newValue)
case reflect.Ptr:
value := src.Elem()
if !value.IsValid() {
return
}
dst.Set(reflect.New(value.Type()))
deepCopy(dst.Elem(), value)
case reflect.Map:
dst.Set(reflect.MakeMap(src.Type()))
keys := src.MapKeys()
for _, key := range keys {
value := src.MapIndex(key)
newValue := reflect.New(value.Type()).Elem()
deepCopy(newValue, value)
dst.SetMapIndex(key, newValue)
}
case reflect.Slice:
dst.Set(reflect.MakeSlice(src.Type(), src.Len(), src.Cap()))
for i := 0; i < src.Len(); i++ {
deepCopy(dst.Index(i), src.Index(i))
}
case reflect.Struct:
typeSrc := src.Type()
for i := 0; i < src.NumField(); i++ {
value := src.Field(i)
tag := typeSrc.Field(i).Tag
if value.CanSet() && tag.Get("deepcopy") != "-" {
deepCopy(dst.Field(i), value)
}
}
default:
dst.Set(src)
}
}

func DeepCopy(dst, src interface{}) {
typeDst := reflect.TypeOf(dst)
typeSrc := reflect.TypeOf(src)
if typeDst != typeSrc {
panic("DeepCopy: " + typeDst.String() + " != " + typeSrc.String())
}
if typeSrc.Kind() != reflect.Ptr {
panic("DeepCopy: pass arguments by address")
}

valueDst := reflect.ValueOf(dst).Elem()
valueSrc := reflect.ValueOf(src).Elem()
if !valueDst.IsValid() || !valueSrc.IsValid() {
	panic("DeepCopy: invalid arguments")
}

deepCopy(valueDst, valueSrc)

}

func DeepClone(v interface{}) interface{} {
dst := reflect.New(reflect.TypeOf(v)).Elem()
deepCopy(dst, reflect.ValueOf(v))
return dst.Interface()
}

func Perm(n int) []int {
m := make([]int, n)
for i := 0; i < n; i++ {
j := rand.Intn(i + 1)
m[i] = m[j]
m[j] = i
fmt.Println(i, m[i], ">>", j, m[j])
}
return m
}

func C(sum, lec int) int {
ret := 1
low := 1
for i := 0; i < lec; i++ {
ret *= sum - i
low *= lec - i
}
// str := fmt.Sprint("C(", sum , ",", lec ,")" , ret/low)
// fmt.Println(str)
return ret / low
}

func Clist(para ...int) int {
all := 1
for i := 0; i < len(para); i += 2 {
all *= C(para[i], para[i+1])
}
return all
}

func Csum(para ...[]int) int {
all := 0
for i := 0; i < len(para); i++ {
all += Clist(para[i]...)
}
return all
}

var randseed int64 = 456213

func Getrand(min, max int64) int64 {
randseed = randseed >> 32 << 32
randseed := (1103515245*randseed + 1) % (2<<31 - 1)
fmt.Println(randseed)
if randseed < 0 {
randseed = -randseed
}
return randseed%(max-min+1) + min
}

func checkflo(flo map[int]int) bool {
for k := range flo {
if flo[k+1] > 0 && flo[k+2] > 0 && flo[k+3] > 0 && flo[k+4] > 0 {
return true
}
}
return false
}

func countdz() {
cards := make([]int, 0)
for i := 1; i < 14; i++ {
cards = append(cards, i)
cards = append(cards, i)
cards = append(cards, i)
cards = append(cards, i)
}
allcount := 1000000
count := make(map[string]int)
flocount := 0
for allcount > 0 {
allcount--
rand.Seed(int64(allcount))
selects := RandIntervalN(0, 51, 7)
static := make(map[int]int)
for i := 0; i < len(selects); i++ {
if v, ok := static[cards[selects[i]]]; ok {
static[cards[selects[i]]] = v + 1
} else {
static[cards[selects[i]]] = 1
}
}

	if checkflo(static) {
		flocount++
	}

	chipList := make([]int, 0)
	for _, v := range static {
		chipList = append(chipList, v)
	}
	sort.Ints(chipList)
	arrStr := ""
	for i := 0; i < len(chipList); i++ {
		arrStr += strconv.Itoa(chipList[i])
	}

	if _, ok := count[arrStr]; ok {
		count[arrStr]++
	} else {
		count[arrStr] = 1
	}
}
fmt.Println(">>", count, flocount)

}

type special int32

func main6f() {
// strconv.ParseInt(...) fastest
// strconv.Atoi(...) still very fast
// fmt.Sscanf(...) not terribly fast but most flexible
// pstr := new(Person05)
// pstr.printInfo()
num := -1 << 63
num = num | (1<<63 - 1)
//newnum := (uint64)(unsafe.Pointer(&num))
//P64(newnum)
if requiresQuotes("sadfa32423") {
fmt.Println(">>>>#$%^&
(")
}
nums := 3
find:
for {
switch {
case nums > 1:
fmt.Println("gjk")
nums--
case 2 > 1:
fmt.Println("999")
break find
}
}

// int32list := RandIntervalN(1, 10, 10)
// fmt.Println(int32list)

// fmt.Println(RandGroup(1,0,3))
// fmt.Println(Perm(10))
// fmt.Println(1<<0)
// v := Person04{}
// dst := reflect.New(reflect.TypeOf(v)).Elem()
// var picks special = 3
// var picks2 special = 2
// mk := picks + picks2
// fmt.Println(v, dst, mk)
//133784560
for i := 0; i < 100; i++ {
	fmt.Println(Getrand(1, 10))

}
C(13, 7)
C(12, 5)
var arr [][]int = [][]int{
	{52, 7},
	{13, 7}, //1
	{13, 1, 12, 5}, {13, 2, 11, 3}, {13, 3, 10, 1},
	{13, 1, 12, 4}, {13, 2, 11, 1},
	{13, 1, 12, 3},

	{13, 2, 2, 1, 11, 2}, //3+2
	{13, 2, 2, 1, 11, 1},
	{13, 3, 3, 1},
	{13, 2, 2, 1},
	{13, 3, 3, 1},

	{13, 5, 47, 2},
}
fmt.Println(Csum(arr...))
for k, v := range arr {
	fmt.Println(k, ">>", float32(Clist(v...)))
}
fmt.Println("................")

absd := Person05{name: "fdafd"}
fmt.Println(absd.name, 133784560*21014559, math.Abs(1))
dict := make(map[int]int)
fmt.Println("ok0", dict[0])
if _, ok := dict[0]; ok {
	fmt.Println("ok1", dict[0])
}
dict[0] = 0

if _, ok := dict[0]; ok {
	fmt.Println("ok2", dict[0])
}
fmt.Println(dict[0], len(dict))

//countdz()\
var s byte = 0

var x interface{} // x 为零值 nil,静态类型为 interface{}
x = 42            //x declared but not used         // x 的值为 42,动态类型为int, 静态类型为interface{}
fmt.Println(x, s)
//var v *T           // v 为零值 nil, 静态类型为 *T
//x = v              // x 的值为 (*T)(nil), 动态类型为 *T, 静态类型为 *T
arrs := []int{1, 2, 3, 4}
fmt.Println(&arrs[0], &arrs[2])
slice := arrs[0:2]

fmt.Println(slice, &arrs[0], &slice[0], &arrs[2])
slice = append(slice, 8)
slice = append(slice, 9)
slice[0] = 11
slice = append(slice, 7)
slice[0] = 16
fmt.Println(slice, &arrs[0], &slice[0], &slice[2], ">>>", arrs[0], &arrs[2], "====", len(slice), cap(slice))

// bytes := hash.Sum([]byte{1,2,3,5})
// fmt.Println(CreateRandomStr("tomorrow"), hex.EncodeToString([]byte{255,16,16,16}), )

test(func() {
	Exponent(3, 5)
})
test(func() {
	math.Pow(3, 5)
})

tmp := [10]byte{9}
fmt.Println(tmp)

apple := -1
fmt.Println(">>>", apple<<5, maxDepth(128))

}

func maxDepth(n int) int {
var depth int
for i := n; i > 0; i >>= 1 {
depth++
}
return depth * 2
}

func GetSec() int64 {
return time.Now().UnixNano() / 10000000
}

func test(fn func()) {
tnum := GetSec()
for i := 0; i < 10000000; i++ {
fn()
}
fmt.Println(">>>", GetSec()-tnum)
}

func Exponent(a, n int64) int64 {
result := int64(1)
for i := n; i > 0; i >>= 1 {
if i&1 != 0 {
result *= a
}
a *= a
}
return result
}

//生成随机字符串//
func CreateRandomStr(seedStr string) string {
h := md5.New()
seedStr = seedStr + strconv.FormatInt(time.Now().UnixNano(), 10)
fmt.Println(seedStr)
io.WriteString(h, seedStr)
cipherStr := h.Sum(nil)
fmt.Println(cipherStr)
payNum := hex.EncodeToString(cipherStr)
return payNum
}

func saferoutine(c chan bool) {
for i := 0; i < 10; i++ {
fmt.Println("Count:", i)
time.Sleep(1 * time.Second)
}
c <- true
}

func panicgoroutine(c chan bool) {
time.Sleep(5 * time.Second)
panic("Panic, omg ...")
c <- true
}

const MaxRune = '\U0010FFFF'
const RuneError = '\uFFFD'

func TestCancelBeforeGenericEvent() {
fsm := fstate.NewFSM(
"start",
fstate.Events{
{Name: "run", Src: []string{"start"}, Dst: "end"},
},
fstate.Callbacks{
"before_event": func(e *fstate.Event) {
fmt.Println(">>>>")
e.Cancel()
},
},
)
fsm.Event("run")
if fsm.Current() != "start" {
fmt.Println("expected state to be 'start'")
}
}

type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}

type interf []int

func swapRange(data interf, a, b, n int) {
for i := 0; i < n; i++ {
ab := data[a+i]
data[a+i] = data[b+i]
data[b+i] = ab
}
fmt.Println(a, b, n, ">>>", data)

}

func rotate(data interf, a, m, b int) {
i := m - a
j := b - m

for i != j {
	if i > j {
		swapRange(data, m-i, m, j)
		i -= j
	} else {
		swapRange(data, m-i, m+j-i, i)
		j -= i
	}
}

swapRange(data, m-i, m, i)

}

func Copy(re *Person04) *Person04 {
re2 := *re
return &re2
}

func outs(obj interface{}){

}

func main6996() {
// c := make(chan bool, 2)
// go saferoutine(c)
// go panicgoroutine(c)
// for i := 0; i < 2; i++ {
// <-c
// }
// fmt.Println(reflect.TypeOf(MaxRune), RuneError)
// TestCancelBeforeGenericEvent()
// list := make([]int, 8)
// for i:=0 ;i< 8;i++ {
// list[i] = i
// }
// rotate(list, 0, 3, 8)
// fmt.Println(list)

reg1 := regexp.MustCompile("a.c")

buf := "abc azc a7c aac 888 a9c  tac"
result1 := reg1.FindAllStringSubmatch(buf, -1)
fmt.Println("result1 = ", result1)


//目标字符串
searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18"
pat := "[0-9]+.[0-9]+"          //正则
f := func(s string) string{
    v, _ := strconv.ParseFloat(s, 32)
    return strconv.FormatFloat(v * 2, 'f', 2, 32)
}
if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
    fmt.Println("Match Found!")
}
re, _ := regexp.Compile(pat)
//将匹配到的部分替换为 "##.#"
str := re.ReplaceAllString(searchIn, "##.#")
fmt.Println(str)
//参数为函数时
str2 := re.ReplaceAllStringFunc(searchIn, f)
fmt.Println(str2)
s := regexp.MustCompile("a{2}").Split("baabaccadaaae", -1)
fmt.Println(s, len(s))
// s: ["", "b", "b", "c", "cadaaae"]

pat = `(((abc.)def.)ghi)`
src := `abc-def-ghi abc+def+ghi`

fmt.Println(regexp.MatchString(pat, src))
// true <nil>

fmt.Println(regexp.QuoteMeta(pat), re.String(),re.SubexpNames())
// \(\(\(abc\.\)def\.\)ghi\)

}

// main6 test
func main6() {
//Path操作

// fmt.Println(path.Ext("c:\\a/b.txt"))                       //.txt
// fmt.Println(path.IsAbs("c:/wind/aa/bb/b.txt"))             //false
// fmt.Println(path.Join("c:", "aa", "bb", "cc.txt"))         //c:/aa/bb/cc.txt
// isMatch, err := path.Match("c:/windows/*/", "c:/windows/system/")
// fmt.Println(isMatch, err)                            //true <nil>
// fmt.Println(path.Split("c:/windows/system/aaa.jpg")) //c:/windows/system/ aaa.jpg
// //FilePath操作
// fmt.Println("FilePath操作-----------------")
// fmt.Println(filepath.IsAbs("c:\\wind\\aa\\bb\\b.txt"))                 //true
 fmt.Println(filepath.Abs("."))                                         //D:\Projects\GoPath\source\demo\syntax\path <nil>

// filepath.Walk("../", WalkFunc)
/*
   File: ../../syntax IsDir: true size: 0
   File: ..\..\syntax\painc IsDir: true size: 0
   File: ..\..\syntax\painc\main.go IsDir: false size: 813
   File: ..\..\syntax\painc\painc.exe IsDir: false size: 2498048
   File: ..\..\syntax\path IsDir: true size: 0
   File: ..\..\syntax\path\path.exe IsDir: false size: 2851328
   File: ..\..\syntax\path\path.go IsDir: false size: 3419
*/
// tepl := "My name is {{ . }}"

// // 解析模板
// tmpl, err := text.New("test").Parse(tepl)

// // 数据驱动模板
// data := "jack"
// err = tmpl.Execute(os.Stdout, data)

w := tabwriter.NewWriter(os.Stdout, 10, 1, 5, '*', 0)
defer w.Flush()
// show := func(name string, v1, v2, v3 interface{}) {
// 	fmt.Fprintf(w, "%s\t%v\t%v\t%v\n", name, v1, v2, v3)
// }
//show("Int31",11111111111,2,2222223)


// Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行

// NumCPU:返回当前系统的 CPU 核数量

// GOMAXPROCS:设置最大的可同时使用的 CPU 核数

// Goexit:退出当前 goroutine(但是defer语句会照常执行)

// NumGoroutine:返回正在执行和排队的任务总数

// GOOS:目标操作系统

fmt.Println("cpus:", runtime.NumCPU(), runtime.NumGoroutine())
fmt.Println("goroot:", runtime.GOROOT())
fmt.Println("archive:", runtime.GOOS)
//runtime.Goexit()


//runtime.GOMAXPROCS(1)  //使用单核
exit := make(chan int)
go func() {
    defer close(exit)
    go func() {
        fmt.Println("b")
    }()
}()

for i := 0; i < 4; i++ {
    fmt.Println("a:", i)

    if i == 1 {
        runtime.Gosched()  //切换任务
    }
}
<-exit


// go say("world")
// say("hello")

}

type T int

func IsClosed(ch <-chan T) bool {
select {
case <-ch:
return true
default:
}

return false

}

func main1112() {
c := make(chan T)
fmt.Println(IsClosed(c)) // false
close(c)
fmt.Println(IsClosed(c)) // true
}

func say(s string){
for i := 0; i < 2; i++ {
runtime.Gosched()
fmt.Println(s)
}
}

func WalkFunc(path string, info os.FileInfo, err error) error {
fmt.Println("File:", path, "IsDir:", info.IsDir(), "size:", info.Size())
return nil
}

func main1158() {
rand.Seed(time.Now().UnixNano())
log.SetFlags(0)

// ...
const MaxRandomNumber = 100000
const NumReceivers = 10
const NumSenders = 1000

wgReceivers := sync.WaitGroup{}
wgReceivers.Add(NumReceivers)

// ...
dataCh := make(chan int, 100)
stopCh := make(chan struct{})
    // stopCh is an additional signal channel.
    // Its sender is the moderator goroutine shown below.
    // Its reveivers are all senders and receivers of dataCh.
toStop := make(chan string, 1)
    // the channel toStop is used to notify the moderator
    // to close the additional signal channel (stopCh).
    // Its senders are any senders and receivers of dataCh.
    // Its reveiver is the moderator goroutine shown below.

var stoppedBy string

// moderator
go func() {
    stoppedBy = <- toStop // part of the trick used to notify the moderator
                          // to close the additional signal channel.
    close(stopCh)
}()

// senders
for i := 0; i < NumSenders; i++ {
    go func(id string) {
        for {
            value := rand.Intn(MaxRandomNumber)
            if value == 0 {
                // here, a trick is used to notify the moderator
                // to close the additional signal channel.
                select {
                case toStop <- "sender#" + id:
                default:
                }
                return
            }
            
            // the first select here is to try to exit the
            // goroutine as early as possible.
            select {
            case <- stopCh:
                return
            default:
            }
            
            select {
            case <- stopCh:
                return
            case dataCh <- value:
            }
        }
    }(strconv.Itoa(i))
}

// receivers
for i := 0; i < NumReceivers; i++ {
    go func(id string) {
        defer wgReceivers.Done()
        
        for {
            // same as senders, the first select here is to 
            // try to exit the goroutine as early as possible.
            select {
            case <- stopCh:
                return
            default:
            }
            
            select {
            case <- stopCh:
                return
            case value := <-dataCh:
                if value == MaxRandomNumber-1 {
                    // the same trick is used to notify the moderator 
                    // to close the additional signal channel.
                    select {
                    case toStop <- "receiver#" + id:
                    default:
                    }
                    return
                }
                
                log.Println(value)
            }
        }
    }(strconv.Itoa(i))
}

// ...
wgReceivers.Wait()
log.Println("stopped by", stoppedBy)

}

func request(timeout time.Duration) (Response, error) {
//用于触发超时的上下文
deadline := time.Now().Add(timeout)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
//用于接收IO响应的通道
respCh := make(chan string)

start := time.Now()

//另起goroutine执行IO操作
go doIO(respCh)

var respData Response
var err error

//如果先接收到响应则停掉超时计时器
//如果超时计时器先触发,则生成一个error的实例
select {
case respData.body = <-respCh:
case <-ctx.Done():
	err = errors.New("request timeout")
}

//记录总耗时
respData.elapse = time.Now().Sub(start)

return respData, err

}

type Response struct {
body string //响应内容
elapse time.Duration //响应耗时
}

func requestS(timeout time.Duration) (Response, error) {
//用于触发超时的计时器
timer := time.NewTimer(timeout)

//用于接收IO响应的通道
respCh := make(chan string)

start := time.Now()

//另起goroutine执行IO操作
go doIO(respCh)

var respData Response
var err error

//如果先接收到响应则停掉超时计时器
//如果超时计时器先触发,则生成一个error的实例
select {
case respData.body = <-respCh:
	timer.Stop()
case <-timer.C:
	err = errors.New("request timeout")
}

//记录总耗时
respData.elapse = time.Now().Sub(start)

return respData, err

}

func doIO(respCh chan string) {
//随机产生一个[0,100)毫秒的延迟,以模拟IO延时延迟
rand.Seed(time.Now().UnixNano())
delay := time.Duration(rand.Intn(100)) * time.Millisecond
fmt.Printf("delay=%v\n", delay)
time.Sleep(delay)

respCh <- "Hello World"

}

func mainTEST() {
resp, err := request(50 * time.Millisecond)
if err != nil {
fmt.Printf("error: %s\n", err.Error())
return
}

fmt.Printf("response: body=%s elapse=%s\n", resp.body, resp.elapse)

}

//worker工作的最大时长,超过这个时长worker自行收工无需等待manager叫停
const MAX_WORKING_DURATION = 5 * time.Second
//达到实际工作时长后,manager可以提前叫停
const ACTUAL_WORKING_DURATION = 2 * time.Second

func add(logs *[]int, lock *sync.Mutex, log int){
lock.Lock()
fmt.Println(">>>", log)
logs = append(logs, log)
lock.Unlock()
}

func qiess(logs []int) {
logs[0] = 99
for i := 0; i<10; i++ {
logs = append(logs, i)
fmt.Printf("%p", logs)
fmt.Println(" ",logs)
}
}

func print(para ...interface{}) {
fmt.Println(para...)
}

func worker1(ch chan struct{}, name string) {
for {
// select {
// case <-ch:
// fmt.Println(name, "return for ctxWithCancel.Done()")
// return
// default:
// fmt.Println(name, "working")
// }
time.Sleep(2 * time.Second)
}
}

func slaver(ch chan int){
//time.Sleep(1 * time.Second)
print(">>>>>0")
ch<-0
print(">>>>>1")
ch<-0
print(">>>>>2")
<-ch
print(">>>>>20")
ch<-0
print(">>>>>30")
}

func onec(ch chan int){
print("onec>>>>>1")
ch<-0
print("onec>>>>>2")
}

func mainfi12(){

chs := make(chan int)
print(">>>>>>>>>>>>")
go slaver(chs)
time.Sleep(1 * time.Second)

print(">>>>>>3")
<-chs
print(">>>>>>4")
<-chs
print(">>>>>>40")
//time.Sleep(1 * time.Second)
print(">>>>>>5")

}

func mainfis() {
var lock sync.Mutex
ch := make(chan int)
logs := make([]int, 0)
go slaver(ch) //go manager(ch, &logs, &lock)
add(&logs, &lock, 1)
<-ch
add(&logs, &lock, 2)
time.Sleep(1 * time.Second)
add(&logs, &lock, 3)

fmt.Println("gogo ", logs)

}

func manager(ch chan int, logs *[]int, lock *sync.Mutex) {
time.Sleep(1 * time.Second)
add(logs, lock, 4)
ch<- 0 //A
add(logs, lock, 5)
ch<- 0 //B
add(logs, lock, 6)
ch<- 0 //C
}

type MyChannel struct {
C chan T
once sync.Once
}

func NewMyChannel() *MyChannel {
return &MyChannel{C: make(chan T)}
}

func (mc *MyChannel) SafeClose() {
mc.once.Do(func(){
close(mc.C)
})
}

func takes() {
rand.Seed(time.Now().UnixNano())
log.SetFlags(0)

// ...
const MaxRandomNumber = 10
const NumReceivers = 2

wgReceivers := sync.WaitGroup{}
wgReceivers.Add(NumReceivers)

// ...
dataCh := make(chan int, NumReceivers)

// the sender
go func() {
    for {
        if value := rand.Intn(MaxRandomNumber); value == 110 {
            // the only sender can close the channel safely.
            close(dataCh)
            return
        } else {            
			print("<<1<", value)
			dataCh <- value
			print("<<2<", value)
		}
		time.Sleep(time.Second)
		
    }
}()

// receivers
for i := 0; i < NumReceivers; i++ {
    go func(i int) {
		time.Sleep(time.Second)
        defer wgReceivers.Done()
        // receive values until dataCh is closed and
		// the value buffer queue of dataCh is empty.
		print(">>>>>>>>>>>>>", i)
        for value := range dataCh {
            print(">>>>>[", i,"]", value)
        }
    }(i)
}

wgReceivers.Wait()

}

func mainfissss(){

var C  chan int
C = make(chan int)
var once sync.Once
once.Do(func(){
	fmt.Println("zzzz")
	close(C)
})
// go func() {
//     for {
//         if value := rand.Intn(10); value == 0 {
//             // the only sender can close the channel safely.
//             close(C)
//             return
//         } else {            
//             C <- value
//         }
//     }
// }()
fmt.Println("zzzz")
takes()

}

func mainfiff() {
rand.Seed(time.Now().UnixNano())
log.SetFlags(0)

// ...
const MaxRandomNumber = 100000
const NumReceivers = 10
const NumSenders = 1000

wgReceivers := sync.WaitGroup{}
wgReceivers.Add(NumReceivers)

// ...
dataCh := make(chan int, 100)
stopCh := make(chan struct{})
    // stopCh is an additional signal channel.
    // Its sender is the moderator goroutine shown below.
    // Its reveivers are all senders and receivers of dataCh.
toStop := make(chan string, 1)
    // the channel toStop is used to notify the moderator
    // to close the additional signal channel (stopCh).
    // Its senders are any senders and receivers of dataCh.
    // Its reveiver is the moderator goroutine shown below.

var stoppedBy string

// moderator
go func() {
    stoppedBy = <- toStop // part of the trick used to notify the moderator
                          // to close the additional signal channel.
    close(stopCh)
}()

// senders
for i := 0; i < NumSenders; i++ {
    go func(id string) {
        for {
            value := rand.Intn(MaxRandomNumber)
            if value == 0 {
                // here, a trick is used to notify the moderator
                // to close the additional signal channel.
                select {
                case toStop <- "sender#" + id:
                default:
                }
                return
            }
            
            // the first select here is to try to exit the
            // goroutine as early as possible.
            select {
            case <- stopCh:
                return
            default:
            }
            
            select {
            case <- stopCh:
                return
            case dataCh <- value:
            }
        }
    }(strconv.Itoa(i))
}

// receivers
for i := 0; i < NumReceivers; i++ {
    go func(id string) {
        defer wgReceivers.Done()
        
        for {
            // same as senders, the first select here is to 
            // try to exit the goroutine as early as possible.
            select {
            case <- stopCh:
                return
            default:
            }
            
            select {
            case <- stopCh:
                return
            case value := <-dataCh:
                if value == MaxRandomNumber-1 {
                    // the same trick is used to notify the moderator 
                    // to close the additional signal channel.
                    select {
                    case toStop <- "receiver#" + id:
                    default:
                    }
                    return
                }
                
                log.Println(value)
            }
        }
    }(strconv.Itoa(i))
}

// ...
wgReceivers.Wait()
log.Println("stopped by", stoppedBy)

}

const MAIL_LIST = "MAIL_LIST"

func get() (ret int64) {

return

}

type pial struct{
Uid int32
List []int32
}

var nameList []string

var pickdata int32

func getpick()(int32,int32){

return 2,10

}

func updatepick() int32{
pickdata = 30
pickdata, err := getpick()
pickdata++
return pickdata + err
}

type datatry struct {
List []int json:"list"
}

var nowd datatry

func getnow()(fill datatry){
print(fill)
return
}

func mainfiqq() {
var t time.Time
var list []int = []int{1,2,3}
num := 10

gos := func()int{
	num = RandInt(10)
	return num
}
for i:= 0; i< gos() ;i++{
	print(i, num)
}
print(t.String(), MAIL_LIST +"sadfkljasd", list[:0])
print( get())
pic := int64(10000)
pic = pic*pic
print(pic)

obj := pial{Uid: 0}

ls := &obj.List
*ls = append(*ls, 1,2)
print(*ls, obj)

lp := obj.List
lp[1] = 999
lp = append(lp[:0], lp[1:]...)
print(*ls, obj, lp)

print(nameList)
nameList = append(nameList, "gogo")
print(nameList)
print(pickdata)
updatepick()
print(pickdata, nowd.List, &(&nowd).List)
getnow()
// "2006-01-02",                         // RFC 3339
// "2006-01-02 15:04",                   // RFC 3339 with minutes
// "2006-01-02 15:04:05",                // RFC 3339 with seconds
// "2006-01-02 15:04:05-07:00",          // RFC 3339 with seconds and timezone
// "2006-01-02T15Z0700",                 // ISO8601 with hour
// "2006-01-02T15:04Z0700",              // ISO8601 with minutes
// "2006-01-02T15:04:05Z0700",           // ISO8601 with seconds
// "2006-01-02T15:04:05.999999999Z0700", // ISO8601 with nanoseconds

datetime := "2015-01-01 02:15:03"  //待转化为时间戳的字符串

//日期转化为时间戳
timeLayout := "2006-01-02 15:05:15"  //转化所需模板  

loc, _ := time.LoadLocation("Local")    //获取时区  
tmp, _ := time.ParseInLocation(timeLayout, datetime, loc) 
timestamp := tmp.Unix()    //转化为时间戳 类型是int64
fmt.Println(timestamp) 

print(time.Unix(1606444036+120,0))
print(strings.Count("asdfasdf","s"))
//时间戳转化为日期  
datetime = time.Unix(timestamp, 0).Format(timeLayout)
fmt.Println(datetime)
testfn := func(str string) {
	datetime = fmt.Sprintf("%s", time.Unix(int64(1000), 0).Format(str))
	print(datetime)
}

testfn("01-02-2006 15:04:05")
testfn("01-02-0006 00022:04:05")

print(strings.Split("01020006", "-"))

// func (re *Regexp) ReplaceAllString(src, repl string) string
// func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
// func (re *Regexp) ReplaceAllLiteralString(src, repl string) string
// ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$
// 分开来注释一下:
// ^ 匹配一行的开头位置
// (?![0-9]+$) 预测该位置后面不全是数字
// (?![a-zA-Z]+$) 预测该位置后面不全是字母
// [0-9A-Za-z] {8,16} 由8-16位数字或这字母组成
// $ 匹配行结尾位置

pat := `([A-Za-z0-9]+)\s*=\s*([A-Za-z0-9]+)`
src := ` abc   = d23    abc1  = f456 `
reg := regexp.MustCompile(pat)
put := reg.ReplaceAllStringFunc(src, func(str string) string {
	print(str)
	return str+"end"
})
print(put)
lss := reg.FindAllStringSubmatch(src, -1)
print(lss)

pats := `(<cr:[f0-9]{6}>([a-zA-Z0-9])</>)`
regs := regexp.MustCompile(pats)
strco := `ni mail to this <cr:ff3ff6>sdfasd</>mm`
lsss := regs.FindAllStringSubmatch(strco, -1)
print(lsss)

print(strconv.QuoteToASCII("\u597adasdf你好fas12"))
print("-----------")

hasWord("\u597adasdf你好fas12")

}

// 一般字符 匹配自身 abc abc
// . 匹配任意除换行符"\n"外的字符, 在 DOTALL 模式中也能匹配换行符 a.c abc
// \ 转义字符,使后一个字符改变原来的意思;
// 如果字符串中有字符 * 需要匹配,可以使用 * 或者字符集[]。 a.c
// a\c a.c
// a\c
// [...] 字符集(字符类),对应的位置可以是字符集中任意字符。
// 字符集中的字符可以逐个列出,也可以给出范围,如 [abc] 或 [a-c],
// 第一个字符如果是 ^ 则表示取反,如 [^abc] 表示除了abc之外的其他字符。 a[bcd]e abe 或 ace 或 ade
// \d 数字:[0-9] a\dc a1c
// \D 非数字:[^\d] a\Dc abc
// \s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
// \S 非空白字符:[^\s] a\Sc abc
// \w 单词字符:[A-Za-z0-9] a\wc abc
// \W 非单词字符:[^\w] a\Wc a c
// 2) 数量词(用在字符或 (...) 之后)
// 语法 说明 表达式示例 匹配结果
// * 匹配前一个字符 0 或无限次 abc
ab 或 abccc
// + 匹配前一个字符 1 次或无限次 abc+ abc 或 abccc
// ? 匹配前一个字符 0 次或 1 次 abc? ab 或 abc
// {m} 匹配前一个字符 m 次 ab{2}c abbc
// {m,n} 匹配前一个字符 m 至 n 次,m 和 n 可以省略,若省略 m,则匹配 0 至 n 次;
// 若省略 n,则匹配 m 至无限次 ab{1,2}c abc 或 abbc
// 3) 边界匹配
// 语法 说明 表达式示例 匹配结果
// ^ 匹配字符串开头,在多行模式中匹配每一行的开头 ^abc abc
// $ 匹配字符串末尾,在多行模式中匹配每一行的末尾 abc$ abc
// \A 仅匹配字符串开头 \Aabc abc
// \Z 仅匹配字符串末尾 abc\Z abc
// \b 匹配 \w 和 \W 之间 a\b!bc a!bc
// \B [^\b] a\Bbc abc
// 4) 逻辑、分组
// 语法 说明 表达式示例 匹配结果
// | | 代表左右表达式任意匹配一个,优先匹配左边的表达式 abc|def abc 或 def
// (...) 括起来的表达式将作为分组,分组将作为一个整体,可以后接数量词 (abc){2} abcabc
// (?P...) 分组,功能与 (...) 相同,但会指定一个额外的别名 (?Pabc){2} abcabc
// <number> 引用编号为 的分组匹配到的字符串 (\d)abc\1 1abe1 或 5abc5
// (?P=name) 引用别名为 的分组匹配到的字符串 (?P\d)abc(?P=id) 1abe1 或 5abc5
// 5) 特殊构造(不作为分组)
// 语法 说明 表达式示例 匹配结果
// (?:...) (…) 的不分组版本,用于使用 "|" 或后接数量词 (?:abc){2} abcabc
// (?iLmsux) iLmsux 中的每个字符代表一种匹配模式,只能用在正则表达式的开头,可选多个 (?i)abc AbC
// (?#...) # 后的内容将作为注释被忽略。 abc(?#comment)123 abc123
// (?=...) 之后的字符串内容需要匹配表达式才能成功匹配 a(?=\d) 后面是数字的 a
// (?!...) 之后的字符串内容需要不匹配表达式才能成功匹配 a(?!\d) 后面不是数字的 a
// (?<=...) 之前的字符串内容需要匹配表达式才能成功匹配 (?<=\d)a 前面是数字的a
// (?<!...) 之前的字符串内容需要不匹配表达式才能成功匹配 (?<!\d)a 前面不是数字的a

func hasWord(str string) {
txt := "abs123abs1234dfs32kkkl54"
//txt = strconv.QuoteToASCII(txt)
print(txt)
pat := ``
reg := regexp.MustCompile(pat)
ret := reg.FindAllStringSubmatch(txt, -1)
print(ret)

reg.ReplaceAllStringFunc2(txt, func(str []string) string {
	print(str)
	return str[0]
})

}

func (re Regexp) ReplaceAllStringFunc2(src string, repl func([]string) string) string {
b := re.replaceAll(nil, src, re.prog.NumCap, func(dst []byte, match []int) []byte {
slice := make([]string, len(match)/2)
for j := range slice {
if match[2
j] >= 0 {
slice[j] = src[match[2j]:match[2j+1]]
}
}
return append(dst, repl(slice)...)
})
return string(b)
}

func replaceFunc(s []string) string {
n := 0
for i := 1; i < len(s); i++ {
ret, _ := strconv.Atoi(s[i])
n += ret
}
return strconv.Itoa(n)
}

func mainfi(){
repl := "1,10 1,50,12 1,12,5 1,20 1,3,2 "
place := regexp.MustCompile("(\d+),(\d+),(\d+)").ReplaceAllStringFunc2
repl = place(repl, replaceFunc)
fmt.Println(repl)
}

// FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it
// returns a slice of all successive matches of the expression, as defined by
// the 'All' description in the package comment.
// A return value of nil indicates no match.

上一篇:理解归并排序js


下一篇:考研:C语言复习笔记 [Hex Note]