我有一個代碼塊,查詢AD和檢索結果並寫入一個通道。在Golang中將一個局部變量的指針傳遞給一個通道是否安全?
func GetFromAD(connect *ldap.Conn, ADBaseDN, ADFilter string, ADAttribute []string, ADPage uint32) *[]ADElement {
searchRequest := ldap.NewSearchRequest(ADBaseDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, ADFilter, ADAttribute, nil)
sr, err := connect.SearchWithPaging(searchRequest, ADPage)
CheckForError(err)
fmt.Println(len(sr.Entries))
ADElements := []ADElement{}
for _, entry := range sr.Entries{
NewADEntity := new(ADElement) //struct
NewADEntity.DN = entry.DN
for _, attrib := range entry.Attributes {
NewADEntity.attributes = append(NewADEntity.attributes, keyvalue{attrib.Name: attrib.Values})
}
ADElements = append(ADElements, *NewADEntity)
}
return &ADElements
}
上述函數返回指向[]ADElements
的指針。
而且在我initialrun
功能,我稱之爲像
ADElements := GetFromAD(connectAD, ADBaseDN, ADFilter, ADAttribute, uint32(ADPage))
fmt.Println(reflect.TypeOf(ADElements))
ADElementsChan <- ADElements
此功能,而且輸出表示
*[]somemodules.ADElement
爲reflect.TypeOf
輸出。
我在這裏的疑問是, 因爲在GetFromAD()
定義ADElements := []ADElement{}
是一個局部變量,必須在堆棧中分配,而當GetFromAD()
退出時,堆棧的內容必須被銷燬,並GetFromAD()
進一步引用必須指向無效的內存引用,而我仍然得到GetFromAD()
沒有任何段錯誤返回的元素的確切數目。這是如何工作的?這樣做安全嗎?
Go在這裏完全沒有問題。 – Volker
謝謝@Volker。但是我想知道它是如何工作:) – nohup