1
golang私はwebsocket接続を作成し、接続されたすべてのユーザー、ブロードキャストまたはユーザーとユーザー通信などを追跡する必要があります。 各ユーザーの識別子として、その接続のメモリアドレスを使用する予定です。 このアプローチには欠点はありますか?私の意見では、WebSocket接続が終了したときに破棄された要求終了コンテキスト内で各ソケットが作成され、接続が残っている限り、プログラムはそれらのメモリアドレスをすべて保持する必要があるため、問題はありません。最後にポインタアドレスをとり、コンテキスト内で一意の識別子として使用するのは安全ですか?
var Socket *socket //i did this in order Socket to be ready without init out of the box just like Mutex //check init function to see how i handle this
type socket struct {
connectedUsers []*User
}
type User struct {
Id unsafe.Pointer
Conn *websocket.Conn
}
func init() {
var sock = new(socket)
sock.connectedUsers = make([]*User, 0)
Socket = sock
}
//NewConnection add a new *User into connected users list
func (*socket) NewConnection(sock *websocket.Conn) {
usr:=new(User)
usr.Conn=sock
usr.Id=unsafe.Pointer(usr)
Socket.connectedUsers=append(Socket.connectedUsers,usr)
}
//then i can do something like
//theOtherUser:=*(*websocket.Conn)(usr.Id)//this will give the connection of the user (hopefully)
本当によく働きますか?何を意味するかを示すためにいくつかのコードを含めることは可能ですか? – Nevermore
@Nevermore私は例を追加 – nikoss
まあ、ちょっと。 IDとしてポインタを使用してもかまいませんが、安全でないものを使用しないでください。パッケージunsafeは安全ではなく、単純なポインタよりも_less_保証さえあります。 – Volker