golang 笔记14

搜集的示例代码

Posted by BY morningcat on October 14, 2021

搜集的示例代码

1. 类型转换

func TestBaseType(t *testing.T) {
	// 类型转换
	var x = -42
	var ux uint = uint(x)
	var fl float64 = float64(x)
	fmt.Println(x, fl, ux)
}

2. 计算md5值

func TestMd5() {
	strValue := "hello world"
	hash := md5.New()
	_, error := hash.Write([]byte(strValue))
	if error != nil {
		fmt.Println(error)
		os.Exit(-1)
	}
	bytes := hash.Sum(nil)
	//fmt.Println(string(bytes))
	md5Value := fmt.Sprintf("%x", bytes)
	fmt.Println(md5Value)
}

3. 斐波那契

package main

func main() {
	fmt.Println(fib(70))
}

var fibs [100]uint64

func fib(n uint) (res uint64) {
	if fibs[n] != 0 {
		res = fibs[n]
		return
	}
	if n < 2 {
		res = 1
	} else {
		res = fib(n-1) + fib(n-2)
	}
	fibs[n] = res
	return
}

4. 闭包封装

package main

func main() {
	var once sync.Once
	once.Do(task1Wrapper(2, 3))
	once.Do(task1Wrapper("2", 3))
	once.Do(task1Wrapper("hello", "world"))
}

// http://topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/sync.html#synconce
// interface{} 可以表示任意类型
func task1(m, n interface{}) {
	fmt.Println(m, n)
}

func task1Wrapper(m, n interface{}) func() {
	// 使用闭包做一层封装,供那些只接收无参的方法使用
	return func() {
		task1(m, n)
	}
}

5. package 中的常识

package main

import (
	. "fmt"                      // 使用 fmt 下的方法,可以忽略 `fmt.`
	_ "studygo/book_manage"      // 使用 _ ,可以不使用该包中的方法,且自动调用该包中的 init() 方法
	ind "studygo/interface_demo" // 导入的包起别名
)

// 初始化方法,会自动调用
func init() {
	Println("当前包初始化方法")
}

func main() {
	Println("Hello world")
	ind.BlankInterfaceDemo4()
}

6. 局部作用域

func Test1(t *testing.T) {
	if v := math.Pow(2, 10); v > 1000 {
		fmt.Printf("2^10=%f  > 1000\n", v) // v的作用域只在当前 {} 内
	}

	var osName = ""
	switch os := runtime.GOOS; os {
	case "darwin":
		osName = "MacOs"
	case "linux":
		osName = "Linux"
	default:
		osName = os
	}
	fmt.Println(osName)
}

7. bytes.Buffer

func Test2(t *testing.T) {
	var buffer1 bytes.Buffer // 类似 java 中的 StringBuilder
	buffer1.WriteByte('m')
	buffer1.WriteString("cat")
	fmt.Println(string(buffer1.Bytes()))

	var buffer2 *bytes.Buffer = new(bytes.Buffer)
	buffer2.Write(buffer1.Bytes())
	buffer2.WriteRune(48)
	fmt.Println(string(buffer2.Bytes()))

	var buffer3 *bytes.Buffer = bytes.NewBuffer(buffer2.Bytes())
	buffer3.WriteString(" hi")
	fmt.Println(string(buffer3.Bytes()))
}

8. json

func Test3(t *testing.T) {
	// map -> json string
	var map1 = make(map[string]interface{})
	map1["name"] = "mc2018"
	map1["age"] = 28
	map1["hobby"] = [...]string{"吃", "玩", "看动漫", "读书"}
	bytes, err := json.Marshal(map1)
	if err != nil {
		return
	}
	fmt.Println(string(bytes))

	// obj -> json string
	type Person struct {
		Name  string   `json:"姓名"`
		Age   uint8    `json:"年龄"`
		Hobby []string `json:"爱好"`
	}
	p1 := Person{"mc2018", 28, []string{"read", "eat"}}
	bytes2, err2 := json.Marshal(p1)
	if err2 != nil {
		return
	}
	fmt.Println(string(bytes2))
}

9. reflect

func Test4(t *testing.T) {
	var x = 10
	v := reflect.ValueOf(x)
	fmt.Println(v.Kind())
	fmt.Println(v.Kind() == reflect.Int)

	w := reflect.TypeOf(x)
	fmt.Println(w.Name())
	fmt.Println(w.Name() == "int")
}

10. sort

func Test5(t *testing.T) {
	var ints = [...]int{7, 3, 9, 2, 7, 1, 0, 45, 6}
	a := sort.IntSlice(ints[:])
	sort.Sort(a)
	fmt.Println(a)
}