2016-04-04 7 views
1

The Go Programming Language book, 6.5 egzersiz, yazar bu ifadeyi kullanarak anlattı:Neden veteriner raporu uint (0) 63 vardiya için çok küçük olabilir?

32 << (^uint(0) >> 63) 

platformu 32 bit veya 64 bit olup olmadığını kontrol etmek.

ifadesi

oldukça açıktır ve biz basit bir kodla sonucu kontrol edebilirsiniz:

package main 

import "fmt" 

func main() { 
    fmt.Println(32 << (^uint(0) >> 63)) 
} 

64-bit platformunda kodu 32-bit platformunda baskı 0 ve 64.

$ go vet ex6-5.go 
ex6-5.go:6: ^uint(0) might be too small for shift of 63 
exit status 1 

Neden go vet uyarıları bu beni gösterir:

Ancak dosya ile go vet kullanarak, ben uyarı alırsınız? Bunu nasıl önleyebilirim?

cevap

2

Bu uint sabit bit düzeyinde uzunluğu türü değil, bunun nedeni Bu aynı zamanda kullanabilirsiniz nedeni budur 63.

tarafından doğru kaymaya sizin için de bir 32 bit olarak kısa, bu yüzden yeterli olabilir olduğunu Bu ifade, platformu test etmek için uint platformunda en verimli int türünü alacaktır.

32-bit platformunda ise, uint 32 bit uzunluğu, ve böylece sağ shift 32 << 0 sonucunda sonunda 32 neden 0, verecekti. Ancak, 64 bit platformunda, uint, 64 bit verir ve bu nedenle, doğru kaydırma 63 bit, 0 yerine 1 verir; bu, 64 sonuçta64 verir.

veterinere kaynak koduna bir göz atın:

go vet shift kontrol ile sürece, 63 bit ile uint ve sağ shift kullandığınız gibi demek ki
71  case types.Int, types.Uint, types.Uintptr: 
72   // These types may be as small as 32 bits, but no smaller. 
73   size = 32 
74   msg = "might be " 
... 
78  if amt >= size { 
79   ident := f.gofmt(x) 
80   f.Badf(node.Pos(), "%s %stoo small for shift of %d", ident, msg, amt) 
81  } 

, kaçmak için hiçbir yolu yoktur kontrol. Sen bayrağını sağlayarak kontrol etmek olduğunu atlamak için deneyebilirsiniz:

go tool vet -shift=false yourfile.go 
1

Neden veteriner uyarıları bana göstermek gider? Bunu nasıl önleyebilirim?

nevets cevabı önerdi:

go tool vet -shift=false yourfile.go 

Ama:

Sen bayrağını sağlayarak kontrol etmek olduğunu atlamak için deneyebilirsiniz Sen go tool vet kullanmamalısınız. Sadece go vet. Ya da bu durumda, sadece bir bayrak geçmeniz gerektiğinden. Bununla birlikte, başlangıç ​​1'e geçin.this thread bkz: değişecektir (Q1 2018) 10,

genellikle "go tool compile" tüketmemek gibi esasen vet (üzerinde çalışan insanlara yararlıdır olan "go tool vet" kullanmayın).

Daha önce size veteriner bayrakları üzerinde kontrol istedi ama eğer " go tool vet" "go vet" şimdi "go tool vet" yapar bütün bayrakları kabul kullanmak gerekiyordu. (" go help vet" bölümüne bakın.)

Yani go vet -shift=false yourfile.go yeterli olmalı.

İlgili konular