【问题标题】:Go array initialization去数组初始化
【发布时间】:2023-03-26 20:20:01
【问题描述】:
func identityMat4() [16]float {
    return {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1 }
}

我希望您能从示例中了解我想要做什么。如何在 Go 中执行此操作?

【问题讨论】:

标签: go


【解决方案1】:
func identityMat4() [16]float64 {
    return [...]float64{
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1 }
}

(Click to play)

【讨论】:

  • 您没有返回单位矩阵。
  • 也可以写成return [16]float64
  • 赞成使用“三个点”。从来不知道! Go lang 是一门简单的语言,但有很多小细节需要学习!
【解决方案2】:

如果您使用 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]

【讨论】:

  • 查看blog.golang.org/2011/01/go-slices-usage-and-internals.html了解数组和切片的区别。
  • Go 官方博客现在特别指出转换矩阵是直接使用数组的少数几个好的用例之一:“数组有它们的位置 — 例如,它们是转换矩阵的良好表示 — 但是它们在 Go 中最常见的用途是为切片保留存储空间。”
【解决方案3】:

如何使用数组初始化器来初始化测试表块:

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)
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2019-11-02
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多