前言
目前项目使用Go,下面谢了一些笔记,记录下go的基础使用。
变量声明
类型在变量后面
s := ""//类型推导
var s string
var s = ""
var s string=""
短变量声明
t := expression
仅用在函数内
多重赋值
var i, j int = 1, 2
for循环
while 用法
sum := 1
for sum < 1000 {
sum += sum
}
三种格式
for initialization;condition;post{
}
字符串range 用法
defer 关键字
将函数推迟到外层函数返回之后执行
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。
推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
指针
数组
声明
var a [10]int
赋值
primes := [...]int{2, 3, 5, 7, 11, 13}
utf-8编码
复合数据结构
channel
ch:=make(chan int ,10)
读 v:=<-ch
写 ch<-v
- 长度为0的channel为不带buffer的channel
- 读在写之前发生
- 不发生额外数据拷贝
slice []T
避免在两个变量中修改同一个底层数组
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
数组创建
[3]bool{true, true, false}
切片创建
[]bool{true, true, false}
make 创建切片
map
用内置函数 make 可以用来创建一个map
ages := make(map[string]int)
用map的字面量创建
ages := map[string]int {"alice":31, "charlie":34, }
delete(移除操作)
闭包
经典代码
实现斐波那契数列
package main
import "fmt"
// 返回一个“返回int的函数”
func fibonacci() func() int {
back1, back2:= 0, 1 // 预先定义好前两个值
return func() int{
temp:=back1
back1,back2=back2,(back1 + back2)
//返回temp
return temp;
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
结构体
type Employee struct
{
ID int
Name string
Address string
Salary float64
}
结构体初始化
初始部分变量,
e1 = Employee{Name:"4"}
方法
方法和函数的区别
在函数名字前面多了一个结构体参数
func (Employee e) salaryAfterTax () float64{
return e.float*0.8
}
指针接收者
结构体和非结构体类型都可声明方法
只加结构体不会修改原值,用指针会修改原字段的值
指针与函数区别(代码示例,一目了然)
https://tour.go-zh.org/methods/5
方法与指针重定向
使用指针接收者的原因:
首先,方法能够修改其接收者指向的值。
其次,这样可以避免在每次调用方法时复制该值。若值的类型为大型结构体时,这样做会更加高效
接口
type Gun interface{Shoot()}
type Reader interface{
Read(b []byte) (int,error)
}
- 空接口
空接口可保存任何类型的值
slice := make([]interface{}, 10)
map1 := make(map[string]string)
map2 := make(map[string]int)
map2["TaskID"] = 1
map1["Command"] = "ping"
map3 := make(map[string]map[string]string)
map3["mapvalue"] = map1
slice[0] = map2
slice[1] = map1
slice[3] = map3
fmt.Println(slice[0])
fmt.Println(slice[1])
fmt.Println(slice[3])
GO 类比java的toString()方法
func (p Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}