目录
Go语言——包
1、一个go语言文件的第一行写这个文件属于哪个包
package main
2、import 这个文件需要哪些包
可以一行一行写
import "fmt"
import "math"
也可以用括号()
import (
"fmt"
"math"
)
3、用文件路径判断包
package 包名(不用写一长串路径,写短的包名就行)
import "包所在的路径" (写路径,而不是包名)
Go语言——函数
1、方法定义
方法名或变量 大写字母开头:
这个方法或变量是属于public,可以让其他包引用
方法名或变量 小写字母开头:
方法或变量私有,只有本package能使用
没有public\protect\private等访问修饰符,通过字母大小写区分
2、几个参数同样数据类型,可以只写一次数据类型
func add(a int, b int) int {}
或
func add(a, b int)int {}
3、可以多值返回
func swap(x, y string) (string, string) {
return y, x
}
4、可以对返回值命名,在函数体中就不用":="定义变量,返回时只"return"即可
func count(a int) (x, y int) {
x = a + 1
y = a - 1
return
}
Go语言——变量
可以连续赋值多个变量
1、var关键字
在函数内外定义都可
可以在变量名后指定类型,也可以不指定(根据你的赋值自动推断数据类型)
指定变量类型:
var i, j int = 1, 2
不指定变量类型:
var a, b, c = true, "hello world", 100
2、var缩写-> ":=",但是":="只能用在函数体内
k := 3
a, b, c := true, "string", 123
Go语言——const常量
常量:一旦赋值了,就不能改了
Go语言——类型
1、基本类型
bool:true/false (不能作0/1运算)
string
整型:int int8 int16 int32 int64 (int:系统是32就是32,系统是64就是64)
无符号整型: uint uint8 uint16 uint32 uint64 uintptr(表示指针)
byte:byte == uint8 字节相当于无符号8位整型
rune:rune == int32 表示一个unicode码点
float32 float64 (没有float,常用float64)
complex64 complex128
2、类型转换
'类型()' 强制转换
不同类型之间需要显示转换
i := 123
f := float64(i)
u := uint(f)
string --> int
int, err := strconv.Atoi(str)
int --> string
string := strconv.Itoa(int)
string --> []byte
var data []byte = []byte(str)
[]byte --> string
var str string := string(data[:])
float64 <-->string
float, err := strconv.ParseFloat(str)
string := strconv.FormatFloat(data)
Go语言——流程控制
1、只有一种循环结构——for
区别:for后面没有括号
for sum:=0; sum < 1000; sum += 1 {
sum += sum
}
for后面的第1、3项:初始值,和每一次循环的操作可以省略:
for ; sum < 1000; {
sum += sum
}
分号也可以省略: //和while很像了,只是没有()
for sum < 1000 {
sum += sum
}
死循环:
for {}
2、if else
和其他语言区别:在执行判断语句之前,可以执行一个语句:
if z := x + y; z<a {...}
3、switch
每个case后面不用加break,相当它会自动加break
case不需要是常量,也不需要是整数
执行switch之前也可以先执行一个语句,在 switch os 中间插入一个赋值语句:
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("...")
case "linux":
fmt.Println("...")
default:
fmtPrintln("...")
}
特殊用法:switch{}替代一堆if else
switch {
case t.Hour() < 12:
fmt.Println("good morning")
case t.Hour() < 17:
fmt.Println("good afternoon")
default:
fmt.Println("good evening")
}
4、defer
defer后面的语句不会马上执行,程序会继续向下执行,等整个函数执行完毕,再回来执行defer
defer后的语句会放到一个栈来保存起来,如果defer语句中间有需要计算的内容,会在入栈之前都计算好,不会在函数最后计算。
如果有多个defer,因为defer被压入栈,所以后进先出的顺序调用。