1. 两个不同类型的整型数不能直接比较,但各种类型的整型变量都可以直接与字面常量(literal)进行比较。
2. ^x 取反操作
3. 浮点数比较:
因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等是不可行的,这可能会导致不稳定的结果。
import "math"
//p 为用户自定义的比较精度,比如0.00001
func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
4. 关于条件语句:
a. 在 if 之后,条件语句之前,可以添加变量初始化语句,使用;间隔;
b.在有返回值的函数中,不允许将“最终的” return 语句包含在if...else...结构中,否则会编译失败:
function ends without a return statement.
失败的原因在于,Go编译器无法找到终止该函数的 return 语句。
5. 任意类型的不定参数:
如果希望传任意类型,可以指定类型为 interface()。
package main
import "fmt"
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 a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknow type.")
}
}
}
func main() {
var v1 int = 1
var v2 int64 = 234
var v3 string = "hello"
var v4 float32 = 1.234
Myprintf(v1, v2, v3, v4)
}
6. 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(dstName)
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
即使其中的 Copy() 函数抛出异常,Go 仍然会保证 dstFile 和 srcFile 会被正常关闭。
(另外,一个函数中可能存在多个 defer 语句。defer 语句的调用是遵照先进后出的原则,即最后一个 defer 语句将最先被执行。)
阅读(1899) | 评论(0) | 转发(0) |