This lock is meaningless, since you will unlock before return
if you really want the lock, it should be like 
s.mutex.RLock()
state := s.state
s.mutex.RUnlock()
return state