英文:
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
。你想知道int
和uint8
之间是否有区别。
是的,int
和uint8
是不同的数据类型。在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
。参数类型是uint8
。int
不能被赋值给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
,因为byte
是uint8
的别名。
英文:
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))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论