Golang 中国

自己目前所知的下划线有以下作用:
1.用在 import 关键字中,表示不调用包的方法,只执行包的 init() 方法

import  _ "github.com/go-sql-driver/mysql"

2.用在方法调用的返回值中表示丢弃该返回值

// 假设方法声明如下
func Add(one, two int64) (int64, int64, int64) {
    sum := one + two
    return one, two, sum
}
// 当只需要两个数的和而不再需要这两个数时,可以这样做
_, _, sum := Add(2,3)

3.有时为了避免变量名和关键字冲突常在变量后面加下划线:

var type_ int

3.检查某个结构体是否实现了某个接口。

// 比如我想要知道结构体struct_(指针)是否实现了`interface_``接口
// 可以这样写:
var _ interface_  = new(struct_)

如果没有实现编译的时候则会提示错误。
现在问题来了,今天看到golang的sync.RWMutex.RLock()方法时看见如下写法:

func (rw *RWMutex) RLock() {
    if race.Enabled {
        _ = rw.w.state
        race.Disable()
    }
    if atomic.AddInt32(&rw.readerCount, 1) < 0 {
        // A writer is pending, wait for it.
        runtime_Semacquire(&rw.readerSem)
    }
    if race.Enabled {
        race.Enable()
        race.Acquire(unsafe.Pointer(&rw.readerSem))
    }
}

百思不得”_ = rw.w.state”这行代码的作用,望大神解答


searching 于 2017-05-03 18:11 修改
3 回复
jthmath
#1 jthmath • 2017-05-03 20:04

_是 Go 的一个【只写】对象,任何值可以赋进去,但不能从中读取

searching
#2 searching • 2017-05-05 17:00

得到一种下划线的新解释,可是能解释一下这行代码吗?

 _ = rw.w.state

实在没看出有什么意义。

searching
#3 searching • 2018-12-06 14:40

可能是为了确保 rw.w.state 可读

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。

作者

发表话题

作者其它话题