一、if
if的条件里不需要括号
if的条件里可以赋值
if的条件里赋值的变量作用域就在这个if语句里
package main
import (
"io/ioutil"
"fmt"
)
func main() {
const filename = "abc.txt"
if contents, err := ioutil.ReadFile(filename); err != nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n", contents)
}
/* if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n", contents)
}*/
}
二、strconv.Itoa(lsb) 转成字符串
三、函数
返回值类型写在最后面
可返回多个值
函数作为参数
没有默认参数,可选参数
package main
import (
"fmt"
"reflect"
"runtime"
"math"
)
func eval(a, b int, op string) (int, error) {
switch op {
case "+":
return a + b, nil
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
q, _ := div(a, b)
return q, nil
default:
return 0, fmt.Errorf(
"unsupported operation: %s", op)
}
}
// 13 / 3 = 4 ... 1
func div(a, b int) (q, r int) {
return a / b, a % b
}
//函数式编程
func apply(op func(int, int) int, a, b int) int {
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name()
fmt.Printf("Calling function %s with args " +
"(%d, %d)\n", opName, a, b)
return op(a, b)
}
/*func pow(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
}*/
//可变参数列表
func sum(numbers ...int) int {
s := 0
for i := range numbers {
s += numbers[i]
}
return s
}
func main() {
if result, err := eval(3, 4, "x"); err!= nil{
fmt.Println("Error:", err)
} else {
fmt.Println(result)
}
q, r := div(13, 3)
fmt.Println(q, r)
fmt.Println(apply(
func(a int, b int) int {
return int(math.Pow(
float64(a), float64(b)))
}, 3, 4))
fmt.Println(sum(1, 2, 3, 4, 5))
}
四、数组
数组是值类型
[10]int和[20]int是不同类型
调用func f(arr [10]int)会拷贝数组
在go语言中一般不直接使用数组,用切片。
五、切片slice
Slice(切片)不是值类型
arr := […]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s的值为[2 3 4 5]//左闭右开区间
slice可以向后扩展,不可以向前扩展
s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
六、map
创建:make(map[string]int)
获取元素:m[key]
key不存在时,获取Value类型的初始值
用value, ok := m[key]来判断是否存在key
Map的遍历
使用range遍历key,或者遍历key, value对
不保证遍历顺序,如需顺序,需手动对key排序
使用len获取元素个数
map的key
map使用哈希表,必须可以比较相等
除了slice,map,function的内建类型都可以作为key
Struct类型不包含上述字段,也可作为key
七、
针对包来说
名字一般使用CamelCase
首字母大写:public 公有
首字母小写:private 私有
包:
每个目录一个包
main包包含可执行入口(main 函数)
为结构定义的方法必须放在同一个包内
可以是不同的文件
八、所有库和第三方库都放在同一GOPATH下。
go bulid 编译
go install 产生pkg文件和可执行文件
go run 直接编译运行