加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

初学golang的一些笔记

发布时间:2020-12-16 18:03:21 所属栏目:大数据 来源:网络整理
导读:1、切片相关方法 make([]int,len,cap) 利用数组或切片创建一个新的切片,len为长度,cap为最大容量 len() 获取数组或切片的长度 cap() 获取切片的最大容量 append(slice,a,b,c) 向切片中追加元素,可以同时追加多个 copy(a,b) 拷贝a的内容到b 2、range关键字

1、切片相关方法

make([]int,len,cap) 利用数组或切片创建一个新的切片,len为长度,cap为最大容量 len() 获取数组或切片的长度 cap() 获取切片的最大容量 append(slice,a,b,c) 向切片中追加元素,可以同时追加多个 copy(a,b) 拷贝a的内容到b 2、range关键字:用于遍历数组、切片、通道、map等,相当于Java中的Iterator 1)、遍历数组、切片 for i,v := range arr{ i:arr的下标,v:对应下标的值 } 2)、遍历map for k,v := range map{ k:map的key,v:map的值value } 3)、遍历Unicode字符串 for i,c := range "go" { i:字符串中字符的下标位置,c:对应的字符的Unicode值 } 3、指针 *:定义指针变量,以及获取指针指向的内存地址存储的值 &:获取一个变量的内存地址 4、map /* 声明变量,默认 map 是 nil */ var map_variable map[key_data_type]value_data_type key_data_type:key的类型 value_data_type:value的类型 /* 使用 make 函数 */ map_variable := make(map[key_data_type]value_data_type) /* 创建 map */ countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"} delete(map,key):delete函数删除map中key对应的值 5、sync.WaitGroup,相当于Java中的CountDownLatch Add(int) 需要等待多少个协程运行完毕 Done() 一个协程运行结束,Add方法中传入的整数减一 Wait() 主协程等待所有子协程执行完成 6、channel通道,相当于Java中生产者消费者问题中的队列 1)、创建channel(通过make()函数实现,包括无缓存channel和有缓存channel); 向channel中添加数据(channel<-data); 从channel中读取数据(data<-channel); 2)、关闭channel(通过close()函数实现,关闭之后无法再向channel中存数据, 但是可以继续从channel中读取数据,因此一般是生产者来关闭channel) 3)、channel分为有缓冲channel和无缓冲channel,两种channel的创建方法如下: var ch = make(chan int) //无缓冲channel,等同于make(chan int,0) var ch = make(chan int,10) //有缓冲channel,缓冲大小是5 其中无缓冲channel,生产者在生产之后需要等待消费者消费,消费者必须等待生产者生产才能消费, 因此读和写都会阻塞 而有缓冲channel在向channel中存入数据没有达到channel缓存总数时,可以一直向里面存, 直到缓存已满才阻塞.由于阻塞的存在,所以使用channel时特别注意使用方法,防止死锁的产生 7、go中的for循环的3种形式 1)、跟Java中的正常情况一样,但不要括号 for init;condition;post{} 2)、跟Java中的while一样,但不要括号 for condition{} 3)、跟Java中的for(;;)一样的死循环,但不要括号 for{} 4)、for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下 for key,value := range oldMap { newMap[key] = value } 8、select 语句 1)基本概念 select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。 select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。 2)语法 Go 编程语言中 select 语句的语法如下: select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定义任意数量的 case */ default : /* 可选 */ statement(s); } 以下描述了 select 语句的语法: 每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如果任意某个通信可以进行,它就执行;其他被忽略。 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。 否则: 如果有default子句,则执行该语句。 如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。 3)实例 package main import "fmt" func main() { var c1,c2,c3 chan int var i1,i2 int //因为c1,c3中都没有放入数据,所以下面3个case都无法执行,最后只能选择default执行 select { case i1 = <-c1: fmt.Printf("received ",i1," from c1n") case c2 <- i2: fmt.Printf("sent ",i2," to c2n") case i3,ok := (<-c3): // same as: i3,ok := <-c3 if ok { fmt.Printf("received ",i3," from c3n") } else { fmt.Printf("c3 is closedn") } default: fmt.Printf("no communicationn") } } 以上代码执行结果为: no communication 9、go语言中高效的字符串拼接 b := bytes.Buffer{} b.WriteString("Hello") b.WriteString(" Word!") s := b.String()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读