Если объявить type s1 []s1, то заполнять так:
s1 := s1{
{
{}, {
{}, {}, {}, {}, {},
}, {},
},
}
Пользы это этого никакой, правда, ибо там негде хранить значения.
Если вам надо просто хранить n-мерный массив, я бы предложил лучше хранить одномерный массив, просто написать функцию обращения к нужному элементу с учетом n-мерности.
Если нужна именно мультивложенность и у вложенных соседних элементов может быть разная размерность, то придется сделать структуру, чтобы можно было хранить значения.
type s1 struct {
Value int // тут любой тип можно, в принципе, лучше указателем
Children []s1
}
func main() {
s1 := s1{
Children: []s1{
{Children: []s1{
{Value: 1}, {Value: 2}, {Value: 3},
}},
{Children: []s1{
{Value: 4}, {Value: 5},
}},
},
}
fmt.Println(s1)
}