go学习笔记-语言基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/recall_yesterday/article/details/81058390
  • go语言的命名规则和大部分语言一样。由字母或者下划线开头。而且大小写敏感,除此之外,go语言的首字母大小写还有其他的门道,如果名字是大写的那么表示这个变量/函数是导出的,其他的包可见。否则是私有的,不可见。
    tip:go语言推荐使用驼峰命名。
  • go语言主要有四种声明方式,var(变量),func(函数),type(类型) ,const(常量)
example:
var a int
func helloWorld(){
   fmt.Println("hello,world")
}
type niHao struct{
  var a int
}
const (
       Success int  = iota
)
  • go语言可以随手定义变量并赋值(使用:=)
    str := “hello”
    如果str之前已经声明过了,那么这个就是个赋值语句啦。相当于退化成=

  • go语言保留了指针,学过c语言的都清楚指针的用法。不再赘述。不过在go语言中,判断一个指针是否为空,用nil而不是NULL。还有值得注意的是,在c语言中,都清楚,不能将一个函数内的变量的地址返回。因为函数执行结束后,这个变量的内存就无效了,指针就属于野指针。但是go可以所以我认为这里是比较危险的,需要注意的,(也认为容易造成不能及时垃圾回收)

  • 在c语言中,动态申请内存,用malloc,c++中用new,那么在go中,用new和make,这两个的区别后面讲。new的用法和c++中的一样。返回一个对应类型的指针。在go语言中,new产生的内存不一定是堆,也可能是栈,这个要看内存的应用场景。在《go语言圣经》中有这样的一个例子:
var global * int
func f(){
   a := 1
   global = &a
}
func g(){
   v  := new(int)
   *v = 2
}

由于包一级的变量生命周期,是与整个程序同寿的,而恰恰,函数f中引用了局部变量(这种现象叫做变量的逃逸)那么这种情况,内存就是从堆上分配的啦。而第二个g函数,由于生命短暂,所以其内存可能是在栈上。这个具体如何要看编译器。

类型

  • 整型在go语言中有很多,int8 ,int16, int32,int64。。以及无符号的。uint8,uint16,uint32,uint64。。而通常来说的int,uint则在go语言中会与平台的类型有关。
  • rune是字符类型,但是是unicode字符类型。byte是字符类型,相当于char
  • 浮点型,go语言中提供了。float32和float64
  • 复数,go语言也提供了复数:complex64和complex128两种精度。
var x complex128  = complex(1,2)
  • 字符串
    go语言提供了原生字符串,使用“反引号代替”双引号。在原生的字符串值中,没有转义,所有的都是字面的意思。

  • 常量 ,使用下面的形式声明。

const (
    e  = 2.71828182845904523536028747135266249775724709369995957496696763
    pi = 3.14159265358979323846264338327950288419716939937510582097494459
)
如果是想定义枚举那么。可以使用如下:
const (
  a int = iota
  b 
  c 
  )

iota也叫做常量生成器。默认值是0,后面的常量会递增。

复合类型

  • 数组和切片。
    数组不必多说,是一个固定长度的盒子。而切片相对于c/c++来说。是一个新的概念,但是劈开外衣,其实可以看作是一个变长的数组,类似vector.
var nums [5]int = [3]int(1,2,3) //普通的定义
nums2 := [...]int{1,2,3,4}      //省略长度的定义
nums3 := [...]int{99:-1}  //长度是100,最后一格的元素是-1.其他的是默认值。

猜你喜欢

转载自blog.csdn.net/recall_yesterday/article/details/81058390