Go 数组初始化

51
func identityMat4() [16]float {
    return {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1 }
}

从这个例子中,我希望你能理解我的意图。如何在Go中实现这个功能?


为什么你的矩阵是一维数组?Go支持多维数组/切片——这些是否更适合这个问题?(http://golang.org/ref/spec#Array_types) - Rick-777
3个回答

55
func identityMat4() [16]float64 {
    return [...]float64{
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1 }
}

(点击播放)


您没有返回一个单位矩阵。 - peterSO
1
也可以写成 return [16]float64 - Ivan Aracki
1
点赞使用“三个点”的方式。以前从未知道!Go语言是一种简单的语言,但需要学习很多小细节! - SwiftMango

6
如何使用数组初始化程序初始化测试表块:
tables := []struct {
    input []string
    result string
} {
    {[]string{"one ", " two", " three "}, "onetwothree"},
    {[]string{" three", "four ", " five "}, "threefourfive"},
}

for _, table := range tables {
    result := StrTrimConcat(table.input...)

    if result != table.result {
        t.Errorf("Result was incorrect. Expected: %v. Got: %v. Input: %v.", table.result, result, table.input)
    }
}

3
如果您使用Go惯用语编写程序,您将会使用切片。例如,
package main

import "fmt"

func Identity(n int) []float {
    m := make([]float, n*n)
    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            if i == j {
                m[i*n+j] = 1.0
            }
        }
    }
    return m
}

func main() {
    fmt.Println(Identity(4))
}

Output: [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]

5
请参阅http://blog.golang.org/2011/01/go-slices-usage-and-internals.html 了解数组和切片之间的区别。 - Jeff Allen
4
官方的 Go 博客现在特别指出,变换矩阵是使用数组直接的少数好用例子之一:“数组有其存在的意义——比如它们是变换矩阵的好表示方式——但它们在 Go 中最常见的目的是为切片提供存储空间。” - tbone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接