博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang学习1—基础语法
阅读量:2441 次
发布时间:2019-05-10

本文共 2339 字,大约阅读时间需要 7 分钟。

文章目录

基础阶段学习知识

:推荐两倍速观看

上述B站视频的对应博客

go语言基本语法
  • 变量声明后必须使用,否则不会编译通过,全局变量除外
  • 变量赋值的三种方式
//第一种var name string = "Alice"//第二种var name = "Alice"//第三种,只能在函数中使用 name := "Alice"
  • 匿名变量用一个下划线"-"表示
  • iota关键字是按照行来计数的,每增加一行就会加1
  • float默认类型是float64float32float64之间不能相互赋值
  • 字符串相关操作
str := "哈哈哈,I am a student" s1 := []rune(str)  //把字符串强制转换为一个run切片 s1[1] = '中' fmt.Println(string(s1))  //将切片转换为字符串,输出为  哈中哈,I am a student
  • rune在本质上是一个int32类型的
  • go中没有关键字char,字符型也是int32
  • go中没有while关键字,只有for循环
  • 可以使用for range遍历数组、切片、字符串、map及通道
  • 初始化数组
arr := [...]int{
1,2,3,4,5,6,7,8,9,10}
  • 数组是值类型,不是引用类型,所以支持==!=运算符
高级语法
切片

切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。

切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合

  • 切片的容量是指 从切片的第一个元素开始到最后的元素的容量
//切片声明var name []T//make函数构造切片make([]T, size, cap)/*T:切片的元素类型size:切片中元素的数量cap:切片的容量*/

切片的扩容原理:代码在src/runtime/slice.go

newcap := old.capdoublecap := newcap + newcapif cap > doublecap {
newcap = cap} else {
if old.len < 1024 {
newcap = doublecap } else {
// Check 0 < newcap to detect overflow // and prevent an infinite loop. for 0 < newcap && newcap < cap {
newcap += newcap / 4 } // Set newcap to the requested cap when // the newcap calculation overflowed. if newcap <= 0 {
newcap = cap } }}
  • 首先判断,如果新申请容量(cap)大于2倍的旧容量(old.cap),最终容量(newcap)就是新申请的容量(cap)。
  • 否则判断,如果旧切片的长度小于1024,则最终容量(newcap)就是旧容量(old.cap)的两倍,即(newcap=doublecap),
  • 否则判断,如果旧切片长度大于等于1024,则最终容量(newcap)从旧容量(old.cap)开始循环增加原来的1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最终容量(newcap)大于等于新申请的容量(cap),即(newcap >= cap)
  • 如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)。
函数
函数作为参数和返回值
import "fmt"func main()  {
function(f1)}func f1() int {
return 10}func function(x func() int) func(int,int) int{
ret := func(a,b int) int{
return a+b } return ret}

上述函数function的传入参数可以是函数,但这个函数的返回值需要是int类型;function的返回值也是函数,返回的这个函数需要满足两个int类型参数,和int类型返回值

匿名函数
  • 在函数结尾加()表示立即执行,一般适用于只使用一次的情况
func main()  {
f1 := func(a,b int) {
println(a+b) } f1(2,3) func(a,b int){
println(a+b) }(1,2)}
闭包
  • 闭包是一个函数,此函数包含了外部作用域的一个变量
func f1(f func())  {
fmt.Println("f1执行了")}func f2(x,y int) {
fmt.Println("f2执行了") fmt.Println(x+y)}//f3 修改后的函数func f3(f func(int,int),x,y int) func() {
tmp := func() {
//fmt.Println(x+y) f(x,y) } return tmp}
随机数
func main()  {
rand.Seed(time.Now().UnixNano()) //生成随机数种子 fmt.Println(rand.Int())}

转载地址:http://iwjqb.baihongyu.com/

你可能感兴趣的文章
基于IBM大型主机,Linux开辟意大利旅游新天地(转)
查看>>
一些Linux试题(经典!!)(转)
查看>>
优化MySQL数据库性能的八大“妙手”(转)
查看>>
福布斯:Sun下场本可避免 老CEO不听劝(转)
查看>>
根据什么选择一套适合自己的linux系统?(转)
查看>>
戴尔将在法国推出Linux笔记本(转)
查看>>
近9成盗版Office用户称愿投奔开源(转)
查看>>
MySQL购InnoDB不敌甲骨文宣布开放数据引擎(转)
查看>>
银行监会选红旗Linux建设公文传输系统(转)
查看>>
红旗支撑国家外汇管理局网上核销系统(转)
查看>>
网上交易中帐号和密码被盗的解决途径(转)
查看>>
Java线程总结(转)
查看>>
Java学习之类的属性(转)
查看>>
轻松搞定Java内存泄漏(转)
查看>>
Java学习之值传递(转)
查看>>
Java 范型攻略篇(转)
查看>>
linux中crontab命令(转)
查看>>
牛人请进 小弟跪求(转)
查看>>
Linux版本凌乱痛失市场(转)
查看>>
大家好,新学生。 请问怎么升级Redhat9.0 kernel 2.4.X-->2.6.18 的详细过程(转)
查看>>