Skip to content

Instantly share code, notes, and snippets.

@ifreesec
Last active May 20, 2025 10:00
Show Gist options
  • Save ifreesec/85d02cceb9f7c6eaa461a8d8be078539 to your computer and use it in GitHub Desktop.
Save ifreesec/85d02cceb9f7c6eaa461a8d8be078539 to your computer and use it in GitHub Desktop.
go 语言之旅,练习

练习:切片
实现 Pic。它应当返回一个长度为 dy 的切片,其中每个元素是一个长度为 dx,元素类型为 uint8 的切片。当你运行此程序时,它会将每个整数解释为灰度值(好吧,其实是蓝度值)并显示它所对应的图像。图像的选择 x*log(y)

package main

import (
	"golang.org/x/tour/pic"
	"math"
)

func Pic(dx, dy int) [][]uint8 {
	s := make([][]uint8, dx)
	for i := 0; i < dx; i++ {
		temp :=make([]uint8, dy)
		for j := 0; j < dy; j++ {
			temp[j] = uint8(float64(i) * math.Log(float64(j)))
		}
		s[i] = temp
	} 
	return s
}

func main() {
	pic.Show(Pic)
}
@hustmx721
Copy link

提供一个可以选择模式的版本:

package main

import (
    "math"
    "golang.org/x/tour/pic"
)

// 计算单个像素的灰度值
func GetPixelValue(x, y int, mode string) uint8 {
    switch mode {
    case "multi":
        return uint8(x * y)
    case "mean":
        return uint8((x + y) / 2)
    case "pow":
        // 处理指数运算可能产生的大数值
        return uint8(math.Pow(float64(x), float64(y)))
    case "multi_log":
        if y <= 0 {
            return 0
        }
        return uint8(float64(x) * math.Log(float64(y)))
    case "mod":
        divisor := y + 1
        if divisor == 0 {
            return 0
        }
        return uint8(x % divisor)
    default:
        return 0
    }
}

// 生成二维图像
func Pic(dx, dy int) [][]uint8 {
    // 创建二维切片
    result := make([][]uint8, dy)
    
    // 定义可用的颜色模式
    modes := []string{"multi", "mean", "pow", "multi_log", "mod"}
    
    // 填充每个像素
    for i := 0; i < dy; i++ {
        // 为当前行分配内存
        result[i] = make([]uint8, dx)
        // 获取当前行的模式
        mode := modes[i%len(modes)]
        // 填充当前行的每个像素
        for j := 0; j < dx; j++ {
            result[i][j] = GetPixelValue(j, i, mode)
        }
    }
    return result
}

func main() {
    pic.Show(Pic)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment