(go圣经系列)复合数据类型

(go圣经系列)复合数据类型

复合数据类型:数组、slice、map、结构体

聚合类型:数组、结构体 (大小都是固定的静态的数据结构)

数组:由同构的元素组成

结构体:由异构的元素组成

动态的数据结构:slice 和 map (长度可以动态的进行改变)

1.数组

var a [3]int					   //数组的定义
fmt.Println(a[0])
fmt.Println(a[len(a)-1])			//len()内置函数返回数组元素的长度
for i , v := range a {
    fmt.Printf("%d %d\n",i,v)
}
for _ , v := range a {
    fmt.Printf("%d\n",v)
}
// 提供顺序的初始化序列
var q [3]int = [3]int{1,2,3}
var r [3]int = [3]int{1,2,3}
fmt.Println(r[2])					// 0 
//数组的长度是根据初始化值的个数确定
q := [...]int{1,2,3}
fmt.Println("%T\n",1)				//[3]int
q := [3]int{1,2,3}
q = [4]int{1,2,3,4}					//error
//[3]int 和 [4]int是不同的数组类型 
//指定索引和对应的值列表给数组进行初始化 
type Currency int 
const (
	USD Currency = iota			//美元  
    EUR 					   // 欧元  
    GBP 					   //英镑 
    RMB						   //人民币 
)
symbol := [...]string{USD: "$",EUR: "&",RMB: "¥"}
fmt.Println(RMB,symbol[RMB])					// "3 ¥"
//数组的元素类型是可以互相比较的 那么数组类型也是可以互相比较的 
a := [2]int{1,2}
b := [...]int{1,2}
c := [2]int{1,3}
fmt.Println(a == b , a == c , b == c )	//"true false true"
d := [3]int{1,2}
fmt.Println(a == d)						//error 不同的类型
案例: 
import "crypto/sha256"
func main() {
    c1 := sha256.Sum256([]byte("x"))
    c2 := sha256.Sum256([]byte("X"))
    fmt.Printf("%x\n%x\n%t\n%T\n",c1,c2,c1==c2,c1)
}
func sha256.Sum256( a []byte)) [32]byte
//Sum256函数对一个任意的字节slice类型的数据生成一个信息的摘要
//摘要由256bit大小 因此对应[32]int数组类型 

说明:函数接收到的参数实际是对应变量的副本(值传递),这个机制导致大数组在函数传递过程中是低效率的。对数组参数的修改都是修改的副本 并不能修改数组本身,这是go语言和其他语言有所不同的一个特点。这也是数组在go中没有被大量使用的一个原因 。

//给[32]byte数组清零:
func zero(ptr *[32]byte) {
    for i := range ptr {
        ptr[i] = 0 
    }
}
//可以显示的传入一个数组指针来对数组原始值进行修改 
[32]byte{}: 一个32字节的数组 数组的每个元素都是零值
//简写
func zero(ptr *[32]byte) {
    *ptr = [32]byte{}
}
练习4.1 
编写一个函数,计算两个SHA256哈希码中不同bit的数目。(参考2.6.2节的PopCount函数.
func count(a , b string) (num int){
    A := sha256.Sum256([]byte(a))
    B := sha256.Sum256([]byte(b))
    for i:=0 ;i <len(A);i++{
        for m:=1 ; m<=8; m++ {
            //一个字节有8bit 拿出一个byte循环8次进行比较 8
            if (A[i] >> uint(m)) != (B[i] >> uint(m)){
                num++ 
            }
        }
    }
    return num 
}
练习4.2 
编写一个程序,默认情况下打印标准输入的SHA256编码,并支持通过命令行flag定制,输出SHA384或SHA512哈希算法.
var hashMethod = flag.String("s","sha256","请输入哈希算法:")
func main() {
    flag.Parse()
    printHash(strings.ToUpper(*hashMethod),"x")
}

func printHash(flag string,str string){
    if flag == "SHA256"{
        fmt.Printf("%x\n",sha256.Sum256([]byte(str)))
        return 
    }
    if flag == "SHA512" {
        fmt.Printf("%x\n",sha512.Sum512([]byte(str)))
    }
    if flag == "SHA384" {
        fmt.Printf("%x\n",sha512.Sum384([]byte(str)))
    }
}

补充个flag包:

flag包
(1)flag.Type(flag名,默认值,帮助信息) *Type 
eg: 
name := flag.String("name","张三","姓名")
age := flag.Int("age",18,"年龄")
married := flag.Bool("married",false,"婚否")
delay := flag.Duration("d",0,"时间间隔")
name age married delay都为对应类型的指针 

(2)flag.TypeVar(Type指针,flag名,默认值,帮助信息) 
var name string
flag.StringVar(&name, "name", "张三", "姓名")

(3)flag.Parse() 以上两种方式需要调用Parse函数进行解析
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《Go语言圣经》是一本广受好评的教材,旨在帮助读者系统地学习和掌握Go语言。这本书以简明清晰的方式介绍了Go语言的各种特性、语法和用法,是入门和进阶者的理想选择。 首先,该书提供了对Go语言基础知识的全面介绍。它从简单到复杂地解释了Go语言的基本概念,诸如变量、函数、循环和条件语句等等。通过丰富的例子和练习,读者能够逐步理解和掌握这些概念。 其次,该书详细介绍了Go语言的高级特性和用法。读者可以学习到Go语言的面向对象编程、并发编程、网络编程等关键技术。并发编程是Go语言的一个独特特性,对于提高程序性能和扩展能力非常重要。 此外,该书还包含了对常见问题和陷阱的讲解,帮助读者避免一些常见的错误和陷阱。同时,书中提供了大量的案例和实践项目,读者可以通过实际操作来巩固所学内容。 《Go语言圣经》以其简洁明了的风格和对细节的深入讲解而闻名。无论是作为初学者的入门指南,还是作为有经验的开发者的参考书,这本书都能满足读者的需求。此外,该书的PDF版本能够方便地在线或离线阅读,为读者提供了更加便捷的学习体验。 综上所述,《Go语言圣经》是一本内容丰富、权威性强的优秀教材。它不仅适合Go语言的初学者,也适用于那些想要深入学习和掌握Go语言的开发者。无论是在线阅读还是PDF版本,读者都能够方便地获取和利用这本宝贵的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值