本文假定读者有其他高级编程语言的基础,重点突出Go语言与其他编程语言使用上的区别。
-
控制判断:
if/for/switch都不需要括号(注意,循环只有for循环)
switch功能强大,可以case写if语句等(switch后面可不写变量),且每个分支不需要break
switch {
case c > 0:
fmt.Println(c, "is a positive number")
default:
fmt.Println(c, "is not a positive number")
}
- 两种赋值方式
var a string = "hhh"//需要指定类型
b := "hhh"
-
数组:长度不可变,需指定类型
很多场景下推荐使用切片(可变长度的数组,用make创建)
切片使用时注意:
- 用append追加元素,必须把append返回的结果赋值回去(可能扩容)
- 不支持类似python的负值索引
var arr[5] int
arr[4] = 100
var aarr[4][3] int
aarr[1][2] = 1
s := make([]string, 3)
for i := 0; i < 3; i++ {
s[i] = "sss"
}
fmt.Println(s, len(s))
fmt.Println(s[1:3])
c := make([]string, len(s))
copy(c, s)
// [sss sss sss] 3
// [sss sss]
- range:实现快速遍历,返回两个值,第一个是索引,第二个是对应的值(可用下划线忽略)
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) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
- map:完全无序,既不是插入顺序也不是字典序
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)
- 函数:注意:变量类型后置,支持返回多个值(如(真实返回结果,错误信息))
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) (int, bool) {
return a + b, true
}
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
}
- 指针:Go语言也支持指针,但是功能相比于C++受限。可以理解为类似Java的传引用,支持对变量的修改,否则Go默认是值传递。
package main
import "fmt"
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
}
未完待续Go语言入门实践(下),感谢阅读