As a head's up, the reason that you can't just parse IEs from probe requests like you could from beacons or probe responses is because gopacket itself never actually assigns to the Payload field of the Dot11MgmtProbeReq struct.  See DecodeFromBytes in Dot11MgmtBeacon and Dot11MgmtProbeResp; Dot11MgmtProbeReq has no such method.  Replacing Dot11MgmtProbeReq from gopacket with the following code fixes this issue (although this may be overkill for you):
type Dot11MgmtProbeReq struct {
    Dot11Mgmt
}
func decodeDot11MgmtProbeReq(data []byte, p gopacket.PacketBuilder) error {
    d := &Dot11MgmtProbeReq{}
    return decodingLayerDecoder(d, data, p)
}
func (m *Dot11MgmtProbeReq) LayerType() gopacket.LayerType  { return LayerTypeDot11MgmtProbeReq }
func (m *Dot11MgmtProbeReq) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeReq }
func (m *Dot11MgmtProbeReq) NextLayerType() gopacket.LayerType {
    return LayerTypeDot11InformationElement
}
func (m *Dot11MgmtProbeReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
    m.Payload = data
    return m.Dot11Mgmt.DecodeFromBytes(data, df)
}
One straightforward way to extract IEs in general is to set up a single core function to pass the list of IEs from the current frame into a function that decodes all relevant elements into a map[string][]byte where the string is a human-readable name for the string.  That way, any frame-specific fields can be requested in their specific cases.  (You need to write a map[layers.Dot11InformationElementID]string` to do this).