Why am I getting a compile error 'cannot use … as type uint8 in argument to …' when the parameter is an int

huangapple go评论95阅读模式
英文:

Why am I getting a compile error 'cannot use ... as type uint8 in argument to ...' when the parameter is an int

问题

我刚刚看到你的问题。这是一个关于Go语言的问题,代码中出现了一个错误。错误信息显示在第76行,指出colorIndex的类型是int,但是img.SetColorIndex函数需要的参数类型是uint8。你想知道intuint8之间是否有区别。

是的,intuint8是不同的数据类型。在Go语言中,int是有符号整数类型,而uint8是无符号整数类型。它们的取值范围和表示方式不同。

在这种情况下,你可以将colorIndex转换为uint8类型,以便与img.SetColorIndex函数的参数类型匹配。你可以使用类型转换操作符uint8()来完成转换,如下所示:

img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(colorIndex))

通过将colorIndex转换为uint8类型,你就可以解决这个错误了。希望这可以帮助到你!如果你还有其他问题,请随时问我。

英文:

I am new to Go and was working through a problem in The Go Programming Language. The code should create GIF animations out of random Lissajous figures with the images being produced in the different colors from palate:

// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

// Run with "web" command-line argument for web server.
// See page 13.
//!+main

// Lissajous generates GIF animations of random Lissajous figures.
package main

import (
	"image"
	"image/color"
	"image/gif"
	"io"
	"math"
	"math/rand"
	"os"
)

//!-main
// Packages not needed by version in book.
import (
	"log"
	"net/http"
	"time"
)

//!+main
// #00ff55
var palette = []color.Color{color.RGBA{0x00, 0xff, 0x55, 0xFF}, color.Black, color.RGBA{0x00, 0x00, 0xff, 0xFF}, color.RGBA{0xff, 0x00, 0xff, 0xFF}}

const (
	whiteIndex = 0 // first color in palette
)

func main() {
	//!-main
	// The sequence of images is deterministic unless we seed
	// the pseudo-random number generator using the current time.
	// Thanks to Randall McPherson for pointing out the omission.
	rand.Seed(time.Now().UTC().UnixNano())

	if len(os.Args) > 1 && os.Args[1] == "web" {
		//!+http
		handler := func(w http.ResponseWriter, r *http.Request) {
			lissajous(w)
		}
		http.HandleFunc("/", handler)
		//!-http
		log.Fatal(http.ListenAndServe("localhost:8000", nil))
		return
	}
	//!+main
	lissajous(os.Stdout)
}

func lissajous(out io.Writer) {
	const (
		cycles  = 5     // number of complete x oscillator revolutions
		res     = 0.001 // angular resolution
		size    = 100   // image canvas covers [-size..+size]
		nframes = 64    // number of animation frames
		delay   = 8     // delay between frames in 10ms units
	)
	freq := rand.Float64() * 3.0 // relative frequency of y oscillator
	anim := gif.GIF{LoopCount: nframes}
	phase := 0.0 // phase difference
  colorIndex := 2
  for i := 0; i < nframes; i++ {
    rect := image.Rect(0, 0, 2*size+1, 2*size+1)
		img := image.NewPaletted(rect, palette)
		for t := 0.0; t < cycles*2*math.Pi; t += res {
			x := math.Sin(t)
			y := math.Sin(t*freq + phase)
      img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), colorIndex)
      colorIndex++
		}
		phase += 0.1
		anim.Delay = append(anim.Delay, delay)
		anim.Image = append(anim.Image, img)
	}
	gif.EncodeAll(out, &anim) // NOTE: ignoring encoding errors
}

//!-main

Here is the error I am getting

lissajous/main.go:76: cannot use colorIndex (type int) as type uint8 in argument to img.SetColorIndex

Is there a difference between int and uint8 types or something?

答案1

得分: 8

colorIndex的类型是int。参数类型是uint8int不能被赋值给uint8。以下是修复程序的一些选项:

  • colorIndex声明为无类型常量

      const colorIndex = 2
    
  • colorIndex声明为uint8类型:

      colorIndex := uint8(3)
    
  • 在调用时转换值:

      img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(colorIndex))
    

你可以将本答案中所有使用的uint8替换为byte,因为byteuint8别名

英文:

The type of colorIndex is int. The argument type is uint8. An int cannot be assigned to a uint8. Here are some options for fixing the program:

  • Declare colorIndex as an untyped constant.

      const colorIndex = 2
    
  • Declare colorIndex as uint8 type:

      colorIndex := uint8(3)
    
  • Convert the value at the call:

      img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(colorIndex))
    

You can replace all uses of uint8 in this answer with byte because byte is an alias for uint8.

答案2

得分: 1

在变量声明中,使用默认类型,对于你的情况,colorIndex := 2,即colorIndex变为int,而不是uint8。

根据文档(https://golang.org/ref/spec#Short_variable_declarations):
“如果存在类型,则每个变量都被赋予该类型。否则,每个变量都被赋予赋值语句中相应初始化值的类型。如果该值是无类型常量,则首先将其转换为其默认类型;...”

“var i = 42 // i是int”

然后

“无类型常量具有默认类型,该类型是在需要类型化值的上下文中隐式转换为常量的类型,例如,在没有显式类型的短变量声明中,如i := 0。无类型常量的默认类型分别为bool、rune、int、float64、complex128或string,具体取决于它是布尔、符文、整数、浮点、复数还是字符串常量。”

因此,要获得uint8,你应该明确声明colorIndex为uint8 var colorIndex uint8 = 2 或者在img.SetColorIndex中将uint8强制转换为:img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(colorIndex))

英文:

In variable declarations, a default type is used, and in your case, colorIndex := 2, i.e. colorIndex becomes int, not uint8.

From the docs ( https://golang.org/ref/spec#Short_variable_declarations ):
"If a type is present, each variable is given that type. Otherwise, each variable is given the type of the corresponding initialization value in the assignment. If that value is an untyped constant, it is first converted to its default type;..."

"var i = 42 // i is int"

and then

"An untyped constant has a default type which is the type to which the constant is implicitly converted in contexts where a typed value is required, for instance, in a short variable declaration such as i := 0 where there is no explicit type. The default type of an untyped constant is bool, rune, int, float64, complex128 or string respectively, depending on whether it is a boolean, rune, integer, floating-point, complex, or string constant."

So to get uint8, you should either explicitly declare colorIndex as uint8 var colorIndex uint8 = 2 or cast uint8 in img.SetColorIndex as :
img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(colorIndex))

huangapple
  • 本文由 发表于 2016年12月18日 02:45:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/41201918.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定