0%

Go语言笔记

Go语言笔记

参考:https://www.runoob.com/go/go-tutorial.html

数据类型

值类型是 int、float、string、bool、struct和array,直接存储值,分配栈的内存空间,被函数调用完之后会释放。

引用类型是 slice、map、chan和值类型对应的指针,存储是一个地址(指针),指针指向内存中真正存储数据的首地址,内存通常在堆分配,通过GC回收。

  1. new 与 make 的区别

new 的参数要求传入一个类型,而不是一个值,它会申请该类型的内存大小空间,并初始化为对应的零值,返回该指向类型空间的一个指针。

make 也用于内存分配,但它只用于引用对象 slice、map、channel的内存创建,返回的类型是类型本身。

基础语语法

  1. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

  2. 第一行代码 package main 定义包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

  3. Go 语言的字符串可以通过 + 实现

  4. 常量定义:const identifier [type] = value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重赋值

area = LENGTH * WIDTH
fmt.Printf("面积为 : %d", area)
println()
println(a, b, c)
}
  1. iota,特殊常量,可以认为是一个可以被编译器修改的常量。iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
  2. select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。
    
  3. go 语言函数可以返回多个值。
  4. Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

接口

并发

包结构

  1. 权限: 所有成员在包内均可见,无论是不是在一个源码文件中。但只有首字母大写的为可导出成员,在包外可见。
  2. 源码必须使用UTF-8。
  3. 包内每个源文件都可以定义一个或多个初始化函数,但编译器不保证执行顺序。编译器先初始化全局变理,然后才开始执行初始化函数。最后才main.main入口函数。
  4. 内部包:所有保存在internal目录下的包(包含自身)仅能被其父目录下的包(包含所有层次的子目录)访问。

反射

测试