看起来 Go 支持多维的 array 和 slice,可以创建数组的数组、切片的切片,但其实并不是。
对依赖动态计算多维数组值的应用来说,就性能和复杂度而言,用 Go 实现的效果并不理想。
可以使用原始的一维数组、“独立“ 的切片、“共享底层数组”的切片来创建动态的多维数组。
<ol><li> 使用原始的一维数组:要做好索引检查、溢出检测、以及当数组满时再添加值时要重新做内存分配。
</li><li> 使用“独立”的切片分两步:
</li></ol><ul><li> 创建外部 slice
<ul><li> 对每个内部 slice 进行内存分配
注意内部的 slice 相互独立,使得任一内部 slice 增缩都不会影响到其他的 slice
</li></ul></li></ul><pre><code class="lang-go"><span class="token comment">// 使用各自独立的 6 个 slice 来创建 [2][3] 的动态多维数组</span>
<span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
x <span class="token operator">:=</span> <span class="token number">2</span>
y <span class="token operator">:=</span> <span class="token number">4</span>
table <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> table <span class="token punctuation">{</span>
table<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> y<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> <ol><li>使用“共享底层数组”的切片</li></ol><ul><li> 创建一个存放原始数据的容器 slice
</li><li> 创建其他的 slice
</li><li> 切割原始 slice 来初始化其他的 slice
</li></ul><pre><code class="lang-go"><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
h<span class="token punctuation">,</span> w <span class="token operator">:=</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">4</span>
raw <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> h<span class="token operator">*</span>w<span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> raw <span class="token punctuation">{</span>
raw<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i
<span class="token punctuation">}</span>
<span class="token comment">// 初始化原始 slice</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>raw<span class="token punctuation">,</span> <span class="token operator">&</span>raw<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">// [0 1 2 3 4 5 6 7] 0xc420012120</span>
table <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> h<span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> table <span class="token punctuation">{</span>
<span class="token comment">// 等间距切割原始 slice,创建动态多维数组 table</span>
<span class="token comment">// 0: raw[0*4: 0*4 4]</span>
<span class="token comment">// 1: raw[1*4: 1*4 4]</span>
table<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> raw<span class="token punctuation">[</span>i<span class="token operator">*</span>w <span class="token punctuation">:</span> i<span class="token operator">*</span>w <span class="token operator"> </span> w<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>table<span class="token punctuation">,</span> <span class="token operator">&</span>table<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">// [[0 1 2 3] [4 5 6 7]] 0xc420012120</span>
<span class="token punctuation">}</span>
</code></pre> 更多关于多维数组的参考