Go 基础语法01 | 青训营笔记 - 掘金 (juejin.cn)
6 数组
数组:具有编号和固定长度的元素序列
func main(){
var a[5]int
a[4] = 100
fmt.Println(a[4],len(a))
b := [5]int{1,2,3,4,5}
fmt.Println(b)
var twoD [2][3]int
for i:=0;i<2;i++{
for j:=0;j<3;j++{
twoD[i][j]=i+j
}
}
fmt.Println("2d: ",twoD)
}
// 100 5
// [1 2 3 4 5]
// 2d: [[0 1 2] [1 2 3]]
7 切片slice
切片可以任意更改长度
- slice 使用make创建
- slice 可以使用append 追加元素(需要把append结果赋值给原数组)
- slice 初始化时有一定长度,在后续操作中会自动扩容
- slice 可以和python一样进行切片操作,但不支持负数索引
func main(){
s := make([]string,3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:",s[2]) // get: c
fmt.Println("len:",len(s)) // len: 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string,len(s))
copy(c,s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g","o","o","d"}
fmt.Println(good) // [g o o d]
}
8 map
- 使用make创建空map
- 可以存储或取出键值对
- 可以使用delete删除键值对
- golang的map是完全无序的,遍历的时候为随机顺序
func main(){
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
r,ok := m["unknow"]
fmt.Println(r,ok) // 0 false
delete(m,"one")
m2 := map[string]int{"one":1,"two":2}
var m3 = map[string]int{"one":1,"two":2}
fmt.Println(m2,m3) // map[one:1 two:2] map[one:1 two:2]
}
9 range
用于对slice或map进行遍历
range进行遍历时,数组会返回两个值:索引、值,如果不需要可以使用"_"占位
func main(){
nums := []int{2,3,4}
sum := 0
for i,num := range nums{
sum += num
if num == 2{
fmt.Println("index",i," ","num:",num) // index 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a":"A","b":"B"}
for k,v := range m{
fmt.Println(k,v)
// a A
// b B
}
for k := range m{
fmt.Println("key",k)
// key b
// key a
}
}
10 函数——实现两变量相加
Golang的变量类型是后置的
Golang的函数支持返回多个值
实际业务中大都返回两个值:第一个值是真正的返回结果,第二个值是一个错误消息
func add(a int,b int)int{
return a+b
}
func add2(a,b int)int{
return a+b
}
func exists(m map[string]string,k string)(v string,ok bool){
v,ok = m[k]
return v,ok
}
func main(){
res := add(1,2)
fmt.Println(res) // 3
v,ok := exists(map[string]string{"a":"A"},"a")
fmt.Println(v,ok) // A true
}
11 指针——数加2
使用:对传入参数进行修改
func add2(n int){
n += 2
}
func add2ptr(n *int){
*n += 2
}
func main(){
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n)
fmt.Println(n) // 7
}
12 结构体
结构体:带类型的字段的集合
type user struct{
name string
password string
}
func main(){
a := user{name: "Tom", password: "0001"}
b := user{name: "Jack", password: "0002"}
c := user{name: "Mary"}
c.password = "0003"
var d user
d.name = "John"
d.password = "0004"
fmt.Println(a,b,c,d) // {Tom 0001} {Jack 0002} {Mary 0003} {John 0004}
fmt.Println(checkPassword(a,"haha")) // false
fmt.Println(checkPassword2(&a,"haha")) // false
}
func checkPassword(u user,password string)bool{
return u.password == password
}
// 支持指针:可实现对结构体的修改;避免大结构体的拷贝开销
func checkPassword2(u *user,password string)bool{
return u.password == password
}
13 结构体方法
Golang 可以为结构体定义方法
将普通函数改成结构体方法,可以使用
a.checkPassword("1111")调用修改方法:
将第一个参数加括号写到函数名称前面
实现结构体的方法:
- 带指针:可以对结构体进行修改
- 不带指针:只是进行拷贝,不能对结构体进行修改
type user struct{
name string
password string
}
func (u user)checkPassword(password string)bool{
return u.password == password
}
func (u *user)resetPassword(password string){
u.password = password
}
func main(){
a := user{name: "Tom", password: "0001"}
a.resetPassword("1111")
fmt.Println(a) // {Tom 1111}
fmt.Println(a.checkPassword("1111")) // true
}