Go语言学习笔记

本文是关于Go语言的学习笔记,涵盖了Go语言的基础知识,如运行方式、包管理、格式化输出、基本类型和引用类型。讲解了Go语言中的变量、常量、控制语句、类型转换、函数、闭包、集合(如数组、切片和Map)的使用。还讨论了Go中的错误处理、并发编程(goroutine和channel)、原子操作、缓冲流以及make和new的区别。文中提到了Go语言的一些坑,如slice操作和time时间格式化的问题,并推荐了一些Go编程的博客和书籍。
摘要由CSDN通过智能技术生成

Go 编程查看标准包函数方法: ctrl + . + h 或者: ctrl + . + g

基础知识

  1. 运行方式()
    Golang提供了go run“解释”执行和go build编译执行两种运行方式,所谓的“解释”执行其实也是编译出了可执行文件后才执行的。

  2. Package管理()
    Golang约定:我们可以用./或../相对路径来引自己的package;如果不是相对路径,那么go会去$GOPATH/src下查找。

  3. 格式化输出()
    类似C、Java等语言,Golang的fmt包提供了格式化输出功能,而且像%d、%s等占位符和\t、\r、\n转义也几乎完全一致。但Golang的Println不支持格式化,只有Printf支持,所以我们经常会在后面加入\n换行。此外,Golang加入了%T打印值的类型,%v打印数组等集合的所有元素。

  4. Go语言基本类型

    • 值类型(基础类型)
      • 0.rune // int32 的别名
        1.bool,一个字节,值是true或者false,不可以用0或者1表示(java中boolean占用4个字节,而boolean作为数组出现时,每个boolean占用1个字节)
        2.int/uint(带符号为与不带符号位的int类型):根据平台不同是32位或者64位
        3.intx/uintx:x代表任意位数,例如:int3,代表占3bit的int类型
        4.byte占用8位,一个字节,相当于uint8,不带符号位
        5.floatx:由于没有double类型,所以float64就是double。float32小数精确到7位,float64小数精确到15位。
        6.complex64/complex128:复数类型
        7.uintptr:保存指针用的类型,也是随着平台改变而改变,因为指针的长度就是随平台而变。
        8.其他类型值:array,struct,string
    • 引用类型
      • slice,map,chan
    • 接口类型
      • interface
    • 函数类型
      • func
  5. 变量和常量()
    1.虽然Golang是静态类型语言,却用类似JavaScript中的var关键字声明变量。而且像同样是静态语言的Scala一样,支持类型自动推断。有一点很重要的不同是:如果明确指明变量类型的话,类型要放在变量名后面。这有点别扭吧?!后面会看到函数的入参和返回值的类型也要这样声明。
    2.短变量声明
    在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
    注意: 函数外的每个语句都必须以关键字开始( var 、 func 等等), 因此 := 结构不能在函数外使用。

  6. 类型转换
    表达式 T(v) 将值 v 转换为类型 T.
var i int = 42 
var f float64 = float64(i)
var u uint = uint(f) 
//或者这样写 
i := 42 
f := float64(i) 
u := uint(f)


7. 常量
常量的声明与变量类似,只不过是使用 const 关键字。
常量可以是字符、字符串、布尔值或数值。
常量不能用 := 语法声明。

const ( f = 12i ) 
func main(){
 const ( a = 2 b = 3.12 c = true d = "sssss" ) 
 fmt.Println(a, b, c, d, f) 
}


8. 控制语句:
作为最基本的语法要素,Golang的各种控制语句也是特点鲜明。在对C继承发扬的同时,也有自己的想法融入其中;
* if/switch/for 的条件部分都没有圆括号(可以写),但必须有花括号。
* switch的case中不需要break(默认break);
* 如果case语句后,想继续下一个case语句执行,需加入fallthrogh
* 没有条件的 switch 同 switch true 一样。
* switch的case条件可以是多个值。
* Golang中没有while。

9. 分号和花括号()
注意: “分号和花括号 “
分号由词法分析器在扫描源代码过程自动插入的,分析器使用简单的规则:如果在一个新行前方的最后一个标记是一个标识符(包括像int和float64这样的单词)、一个基本的如数值这样的文字、或break continue fallthrough return ++ – ) }中的一个时,它就会自动插入分号。 分号的自动插入规则产生了“蝴蝶效应”:所有控制结构的左花括号不都能放在下一行。因为按照上面的规则,这样做会导致分析器在左花括号的前方插入一个分号,从而引起难以预料的结果。所以Golang中是不能随便换行的。

10. 函数;
* 1. func关键字。
* 2. 最大的不同就是“倒序”的类型声明。
* 3. 不需要函数原型,引用的函数可以后定义。这一点很好,不类似C语言里要么将“最底层抽象”的函数放在最前面定义,要么写一堆函数原型声明在最前面。
* 4. 函数的定义:
func 关键字 函数名(参数1..)(返回值1, 返回值2 ){
函数体
}

如:
func add(a int, b int)(ret int, err int){ return a+b, b }
* 5. 函数也是值,它们可以像其它值一样传递。函数值可以用作函数的参数或返回值。

func main() {
     toSqrt := func(x, y float64)float64 { return math.Sqrt(x*x + y*y) } 
     fmt.Println(toSqrt(12, 5)) 
     fmt.Println(autoSqrt(toSqrt)) 
     fmt.Println(autoSqrt(math.Pow)) 
 } 

 func autoSqrt(fn func(x, y float64) float64) float64 {
     return fn(4, 3)
 }


* 6. 函数的闭包
Go 函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。 该函数可以访问并赋予其引用的变量的值,换句话说,该函数被“绑定”在了这些变量上。

11. 集合()基本数据结构 slice, struct
* 1. Golang提供了数组和Map作为基本数据结构:
* 2. 数组中的元素会自动初始化,例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值