Go基本概念
程序结构
- 包声明。package main: 表示一个可独立执行的程序,每个应用程序都包含一个名为 main 的包。
- 引用。import “fmt” : fmt 包实现了格式化 IO(输入/输出)的函数。
- 函数。func main(): 每一个可执行程序所必须包含的,启动后第一个执行函数(如果有 init() 函数则会先执行该函数)。
- 语句或表达式。
- 注释。/* */或 //
- 标志符。大写变量类型public,小写变量类型protected
语句
不用以;结尾,一行多语句才需要。
数据类型
- uint/int 8/16/32/64:无符号、有符号整型;
- float32/float64浮点数,complex64/complex128复数;
- bool:false/true,默认false;
- string:默认"";
- unitptr:无符号整型,存放指针;
- byte:类型unit8
- rune:类型int32
所有像 int、float、bool 和 string 这些基本类型都属于值类型,指向内存中值,而j = i,实际上是在内存中将 i 的值进行了拷贝
变量声明
- var identifier1, identifier2 type
- var a string = “Runoob”
- intVal,intVal1 := 1,2 -----------:=赋值操作符
常量
- 变量var变为const
- 枚举
const (
Unknown = 0
Female = 1
Male = 2
)
函数
- 自定义:func max(num1, num2 int) int {}
- 声明一个函数类型:type cb func(int) int
- len(string)
- unsafe.Sizeof(string) ----指针16吧
- 结构体函数
/* 定义结构体 */
type Circle struct {
radius float64
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
数组
- var balance [10] float32
- var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- var balance = […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- var threedim [5][10][4]int
- a = [3][4]int{
{0, 1, 2, 3} , /* 第一行索引为 0 /
{4, 5, 6, 7} , / 第二行索引为 1 /
{8, 9, 10, 11}, / 第三行索引为 2 */
}
结构体
- type Books struct {}
- Books{“Go 语言”, “www.runoob.com”, “Go 语言教程”, 6495407}
- 通过.访问
- 结构体指针访问也通过.
- 结构体传入函数修改无效,传入结构体指针 修改有效
go语言切片
- var slice1 []type = make([]type, len)
- slice1 := make([]type, len)
- make([]T, length, capacity)
语句
条件语句
- if a < 20 { ----条件没有括号
- switch
switch var1 {
case val1:
default:
...
}
printf
fmt.Printf(“变量的地址: %x\n”, &a )
var numbers = make([]int,3,5);fmt.Printf(“len=%d cap=%d slice=%v\n”,len(x),cap(x),x)
不一样地方
- a, b, c = 5, 7, “abc” -------------多变量赋值
- a, b = b, a -------------交换变量的值
- return a,b,c -------------函数多返回值
- fmt.Printf(“第 3 行 - c 变量类型为 = %T\n”, c );----输出c的类型
- a = a++ -------------自增自减不能用于赋值语句
map
/* 声明变量,默认 map 是 nil /
var map_variable map[key_data_type]value_data_type
/ 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
// 创建1
countryCapitalMap := map[string]string{"a": "apple", "b": "banana"}
// 创建2
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
// 遍历如下
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}
// 查看元素是否存在
capital, ok := countryCapitalMap [ "American" ]
// 删除
delete(countryCapitalMap, "France")
iota 特殊常量
从出现的行数从0开始
select语句
chan
- 不带缓存
make(chan 数据类型) - 带缓存
make(chan 数据类型,长度),写入超过数量会阻塞 - 关闭
通道缓存区
- ch := make(chan int, 100)
- ch <- 1 ------------------写入通道
- var1 := <- ch ---------由通道读出
- v, ok := <-ch
- close© -----------------关闭
貌似通道类似栈吧,后进先出
for
- for a := 0; a < 10; a++ {}
- for a < b {}
- numbers := [6]int{1, 2, 3, 5};for i,x:= range numbers {}
goto
LOOP: for a < 20 {
if a == 15 {
/* 跳过迭代 */
a = a + 1
goto LOOP
}
fmt.Printf("a的值为 : %d\n", a)
a++
}
switch 的 fallthrough
貌似fallthrough后case必然执行,后面就不执行了(若下一个case有fallthrough,需要继续)
接口
/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
..
}
var a interface_name
a = new(实现的struct)
错误
// errorMsg不为空就输出
if result, errorMsg := Divide(100, 0); errorMsg != "" {
fmt.Println("errorMsg is: ", errorMsg)
}
常见命令
命令 | 说明 |
---|---|
go build hello.go | 编译成二进制,win下生成exe文件 |
./不带后缀的文件名 | 运行二进制文件,win下运行对应exe文件 |
常见问题
- .\test.go:6:6: a declared and not used:声明的变量未用