package main

import (
	"crypto/sha256"
	"fmt"
	"strings"
)

func main() {
	// 数组是一个由固定长度的特定类型元素组成的序列，
	// 一个数组可以由零个或多个元素组成。
	// 因为数组的长度是固定的，因此在Go语言中很少直接使用数组。
	// 和数组对应的类型是Slice（切片），它是可以增长和收缩的动态序列，
	// slice功能也更灵活，但是要理解slice工作原理的话需要先理解数组。

	// 数组的每个元素可以通过索引下标来访问，
	// 索引下标的范围是从0开始到数组长度减1的位置。
	// 内置的len函数将返回数组中元素的个数。
	var arr1 [5]int = [5]int{4, 5, 6, 7, 8}
	fmt.Printf("%T %[1]v %d\n", arr1, len(arr1))

	// 可以使用range 配合 for循环来遍历数组
	arr2 := [6]int{4, 5, 6, 7, 8, 9}
	for i, j := range arr2 {
		fmt.Printf("[%d] %d\n", i, j)
	}

	// 我们将会发现，数组、slice、map和结构体字面值的写法都很相似.
	// 上面的形式是直接提供顺序初始化值序列，
	// 但是也可以指定一个索引和对应值列表的方式初始化，就像下面这样
	type Currency int

	const (
		USD Currency = iota // 美元
		EUR                 // 欧元
		GBP                 // 英镑
		RMB                 // 人民币
	)
	symbol := [...]string{USD: "$", EUR: "€", GBP: "￡", RMB: "￥"}
	fmt.Println(RMB, symbol[RMB]) // "3 ￥"

	// 定义了一个含有100个元素的数组str3，最后2个元素被初始化为3和-1，其它元素都是用0初始化。
	str3 := [...]int{98: 3, -1}
	fmt.Printf("%T %[1]v \n", str3)

	slice := []int{1, 2, 3}
	fmt.Printf("%T \n", slice)

	// practice4.1
	diffSHA256 := func(str string) int {
		sha1 := sha256.Sum256([]byte(strings.ToLower(str)))
		sha2 := sha256.Sum256([]byte(strings.ToUpper(str)))
		fmt.Printf("%x \n%x \n", sha1, sha2)
		diff := 0
		for i, _ := range sha1 {
			if sha1[i] != sha2[i] {
				diff++
			}
		}
		return diff
	}
	fmt.Printf("%d", diffSHA256("xxx"))

}
