乐趣区

关于golang:Golang编程中遇到的小陷阱

1.int 类型和 float 类型不能匹配

go 语言规定不容许在整数型变量和浮点型变量之间进行任何数学运算。谬误例子如下:

    var n, m = 21, 2.1
    // 上面一行会报错:invalid operation: n / m (mismatched types int and float64)
    fmt.Println(n / m) 

改过后果如下:

    var n = 21 / 2.1
    fmt.Println(n)

2.int 类型和 time.Duration 类型不能匹配

go 语言规定数值运算的操作数必须具备雷同的类型,除非该操作蕴含类型转换或非类型化常量。谬误例子如下:

    var n = 3
        // 上面一行会报错:invalid operation: timeout * time.Millisecond (mismatched types int and time.Duration)
    fmt.Println(n * time.Millisecond)

改过后果如下:

    // 1. 应用常量
    const n = 3
    fmt.Println(n * time.Millisecond)
 
    // 2. 应用雷同类型
    var n time.Duration = 10
    fmt.Println(n * time.Millisecond)

3. 构造体 struct

1)申明指针构造体时,如果未初始化,则初始值为 nil,因而只有初始化后,能力拜访字段或为字段赋值。例子如下:

type City struct {Name string}
 
var c *City
// 谬误用法, 未初始化, c 为 nil
c.Name = "Osaka" 
c = &City{}
// 初始化后,构造体指针指向某个构造体地址,能力拜访字段,为字段赋值
c.Name = "Tokyo" 
 
// 因而,罕用的做法如下
c := &City{}    
c.Name = "London"  

2)应用 Go 内置 new() 函数,能够分配内存来初始化构造休,并返回调配的内存指针,因为曾经初始化了,所以能够间接拜访字段。例子如下:

var c = new(City)
c.Name = "NewYork"

其余诸如申明一个 map 不能立刻赋值,类型断言失败会 panic,二次敞开一个 channel 也会 panic 等比拟常见的就临时不具体介绍啦

退出移动版