2顺序编程
变量
变量声明
- var v1 int
- var v2 string
- var v3 [10]int //数组
- var v4 [] int //数组切片
- var v5 struct {
f int
} - var v6 * int //指针
- var v7 map[string]int //map,key为string类型,value为int类型
- var v8 func(a int) int
- var (
v1 int
v2 string
)
变量初始化
- var可以保留,但不是必要元素
- var v1 int = 10
- var v2 = 10 //编译器自动推导出v2类型
- v3 := 10 //编译器自动推导出v3类型
变量赋值
- var v10 int
- v10 = 123
多重赋值 i,j = j,i
匿名变量
func GetName()(fistname,lastname,nickname string){
return "May","Chan","Chi"
}
_,_,nickname := GetName()
常量
字面常量literal
常量定义 const
- const PI float64 = 3.1433434
- const zero = 0.0
- const (
size int64 = 1024
eof = -1
) - const u,v float32 = 0,3
- cosnt a,b,c = 3,4,"foo"
预定义常量
- true
- false
- iota
一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,在下一个const出现之前,每出现一次,代表的数字自动增1
枚举
const (
Sunday = ioa
Monday
Tuesday
Wednesday
...
)
类型
布尔类型:bool
不支持自动或强制类型转换
var v1 bool
v1 = true
v2 := (1 == 2)
整型:int8、byte、int16、unit、uintptr
-
int8 1 -128-127
-
unit8(byte) 1 0-255
-
int 平台相关
-
unit 平台相关
-
unitptr 同指针,在32位平台4字节,64位平台8字节
-
var value int32
-
value1 :=64 //value1会自动推导为int类型
-
value2 = value1 //编译错误
-
value2 = int32(value1)
浮点类型:float32、float64
浮点数比较
import "math"
func isEqual(f1,f2,p float64) bool{
return math.Fdim(f1,f2) < p
}
复数类型
字符串类型
var str string
字符串操作
"hello"+"123"
len("hello")
"hello"[1]
字符串遍历
str : = "hello 世界"
n := len(str)
for i:=0;i<n;i++{
ch := str[i]
fmt.Println(i,ch)//每个中文字符在utf8占3个字节
}
for i,ch := range str{
fmt.Println(i,ch) //ch类型为rune
}
字符类型
- byte unit8别名 UTF-8字符串单个字节值
- rune 代表单个Unicode字符
数组
- [32]byte
- [2*N] struct
- [1000]*float64
- [3][5]int
- [2][2][2]float64
- arrLength := len(arr)
- 遍历
for i:=0;i<len(array);i++{
}
for i,v:=range array{
}
- 值类型
数组切片
一个指向数组的指针,拥有自己的数据结构
- 一个指向原生数组的指针
- 数组切片中的元素个数
- 数组切片已分配的存储空间
创建数组切片
基于数组
package main
import "fmt"
func main() {
var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var mySlice []int = myArray[:5]
fmt.Println("Elemenets of myArray:")
for _, v := range myArray {
fmt.Println(v, "")
}
fmt.Println("\nElemenets of mySlice:")
for _, v := range mySlice {
fmt.Println(v, "")
}
fmt.Println()
}
直接创建
- mySlice := make([]int,5)
- mySlice := make([]int,5,10)//初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间
- mySlice := []int
元素遍历
range
动态增减元素
- cap()返回数组切片分配的空间大小
- len()返回数组切片存储的元素个数
mySlice = append(mySlice,1,2,3)
mySlice2 := []int{8,9,10}
mySlice = append(mySlice,mySlice2...)
基于数组切片创建数组切片
oldSlice := []int{1,2,3,4,5}
newSlice := oldSlice[:3]
内容复制
mySlice1 := []int{1,2,3,4,,5}
mySlice2 := []int{5,4,3}
copy(slice2,slice1)//只会复制slice1前3个元素到slice2中
copy(slice1,slice2)//只会复制slice2前3个元素到slice1前3个位置
map
变量声明
var myMap map[string] PersonInfo
创建
myMap = make(map[string] PersonInfo)
myMap = make(map[string] PersonInfo,1000)
myMap = map[string] PersonInfo{
"1234":PersonInfo{"1","jack"}
}
赋值
myMap["12345"] = PersonInfo{"12345", "Tome", "Room 201"}
删除
delete(myMap,"12345")
查找
value, ok := myMap["1234"]
if ok{
}
流程控制
条件
不允许将“最终的”return语句包含在if ...else...
选择
循环
sum :=0
for i :=0; i < 10; i++ {
sum +=i
}
sum :=0
for{
sum++
if sum > 100 {
break
}
}
a := []int{1, 2, 3, 4, 5, 6}
for i,j:=0,len(a)-1;i<j;i,j=i+1,j-1{
a[i],a[j]=a[j],a[i]
}
跳转
goto
函数
不定参数
func Printf(format string,args ...interface{})
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is an int value.")
}
}
}
func main() {
var v1 int = 1
var v2 string = "string"
MyPrintf(v1, v2)
}
多返回值
匿名函数与闭包
匿名函数
func (a,b int,z float64) bool{
return a*b < int(z)
}
f := func(x,y int) int{
return x+y
}
func(ch chan int){
ch <- ACK
}(reply_chan) //表示函数调用
闭包
func main() {
var j int = 5
a := func() func() {
var i int = 10
return func() {
fmt.Printf("i,j:%d,%d\n", i, j)
}
}()
a()
j *= 2
a()
}
错误处理
error接口
type error interface{
Error() string
}
func Foo(param int)(n int,err error){
}
n,err := Foo(0)
if err != nil{
}else{
}
defer
func CopyFile(dst, src string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
return
}
defer srcFile.Close()
dstFile, err := os.Create("")
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
浙公网安备 33010602011771号