Polynomial implementation in Golang
Your code is missing automatic tests.

One test case you definitely need is to ensure that PolyAdd and the related functions do not modify their arguments. As far as I can see by reading the code, the current version of PolyAdd modifies the bigger of its arguments, which is unexpected.

The reason that the argument is modified is that slices are essentially pointers, and when passing them as arguments, their content is not copied.

You should define a constructor function NewPoly(deg int) to hide all the implementation details. Using this constructor will also solve the aliasing problem mentioned above.

Regarding the long code for Str, you can merge some of the duplicate code:

    c := p.Coeffs[i]
    if c == 0 {
        continue;
    }

    if c &gt; 0 {
        s += " + "
    } else {
        s += " - "
    }

    if (c != 1 &amp;&amp; c != -1) || i == 0 {
        s += strconv.FormatFloat(c, 'g', -1, 64)
    }
    if i &gt; 1 {
        s += "x^" + strconv.Itoa(i)
    } else if i == 1 {
        s += "x"
    }


By extracting the expression p.Coeffs[i] into a variable, the code gets a bit cleaner. 

If you need to speed up Str, use a strings.Builder instead of the += operator.