Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
numbers = append(numbers[:2], append([]int{3}, numbers[2:]...)...)
s = append(s, 0)
copy(s[i+1:], s[i:])
s[i] = x
insert(numbers, i, v)?То есть возможность упереться в память при увеличении размера слайса вас не заботит (а это хоть и временное, но двукратное увеличение!)
a = append(a[:position], append([]T{x}, a[position:]...)...)
a.insert(position, value);
func main() {
d := []int{1,2,3,4}
s := NewHandySlice(d)
s.Insert(2, "abc")
fmt.Println(s.Values()[1].(int))
fmt.Println(s.Values()[2].(int))
}
2 panic: interface conversion: interface is string, not int
школьник тыкающий в Пайка и Томпсона, «объясняющий» им своим невежством, какой плохой они придумали дизайн — это мне непонятно
package main
import "fmt"
type IndexTeller interface {
Index (value interface{}) (pos int)
}
type MySlice []interface{}
func (s MySlice) Index(value interface{}) (pos int) {
for pos, e := range s {
if e == value {
return pos
}
}
return -1
}
func main() {
arr_i := MySlice{1, 2, 3, 4, 5}
arr_s := MySlice{"a", "b", "c", "d", "e"}
arr_m := MySlice{MySlice{1, 2, 3}, MySlice{"a", "b", "c"}}
var i int
i = arr_i.Index(2)
fmt.Println(i)
i = arr_s.Index("c")
fmt.Println(i)
i = arr_m.Index(MySlice{1, 2, 3})
fmt.Println(i)
}
[guest@localhost go]$ go run t.go
1
2
panic: runtime error: comparing uncomparable type main.MySlice
goroutine 1 [running]:
main.MySlice.Index(0x18335f50, 0x2, 0x2, 0x80e5400, 0x183380a0, 0x0)
/home/guest/tmp/tests/misc/go/t.go:13 +0x90
main.main()
/home/guest/tmp/tests/misc/go/t.go:33 +0x89e
goroutine 2 [runnable]:
runtime.forcegchelper()
/usr/lib/golang/src/runtime/proc.go:90
runtime.goexit()
/usr/lib/golang/src/runtime/asm_386.s:2287 +0x1
goroutine 3 [runnable]:
runtime.bgsweep()
/usr/lib/golang/src/runtime/mgc0.go:82
runtime.goexit()
/usr/lib/golang/src/runtime/asm_386.s:2287 +0x1
goroutine 4 [runnable]:
runtime.runfinq()
/usr/lib/golang/src/runtime/malloc.go:712
runtime.goexit()
/usr/lib/golang/src/runtime/asm_386.s:2287 +0x1
exit status 2
[guest@localhost go]$
package main
import (
"fmt"
)
type arr []interface{}
func (a *arr) insert(pos int, x interface{}) {
*a = append((*a)[:pos], append([]interface{}{x}, (*a)[pos:]...)...)
}
func main() {
a := arr{1, 2, 3, 4, 5}
a.insert(2, 77)
fmt.Println(a)
// out: [1 2 77 3 4 5]
}
func insert(a *[]int, pos int, x int) {
*a = append((*a)[:pos], append([]int{x}, (*a)[pos:]...)...)
}
Ты ведь в курсе что можно оборачивать код который тебе не нравится в функции с более красивым дизайном?
func insert(s interface{}, pos int, x interface{}) {
switch a := s.(type) {
case *[]int:
*a = append((*a)[:pos], append([]int{x.(int)}, (*a)[pos:]...)...)
case *[]byte:
*a = append((*a)[:pos], append([]byte{x.(byte)}, (*a)[pos:]...)...)
case *[]string:
*a = append((*a)[:pos], append([]string{x.(string)}, (*a)[pos:]...)...)
// case ...
}
return
}
s одного типа, а x — другого, будет ошибка приведения.Этот синтаксис показывает программисту, что операция которую он совершает, не простое присваивание, а ресурсоемкая задача.
Расслабьтесь и наслаждайтесь жизнью в сторонке от Go.
Спасибо за просвещение.
Теперь поднимитесь на пару уровней выше по ветке и посмотрите, на какой именно комментарий я отвечал.
И это необходимый минимум, чтобы вставить элемент в массив. Ты все еще считаешь, что Go совершенен?
Если я скажу «не люблю копипастить, были бы дженерики тут», это все поддержат, ибо никто этого не любит, это очевидная проблема, и никто даже обсуждать это не будет, про нее все знают
...And yet, with that long list of simplifications and missing pieces, Go is, I believe, more expressive than C or C++. Less can be more.
But you can't take out everything. You need building blocks such as an idea about how types behave, and syntax that works well in practice, and some ineffable thing that makes libraries interoperate well.
We also added some things that were not in C or C++, like slices and maps, composite literals, expressions at the top level of the file (which is a huge thing that mostly goes unremarked), reflection, garbage collection, and so on. Concurrency, too, naturally.

Лишь о том, что у него есть свои сильные стороны и что ситуативно имеет смысл его использовать
мне он не показался бажным или неповоротливым.
<offtop>
</offtop>
никогда не пытался смотреть видео или гифки вконтакте
var numbers = [0, 1, 2, 3, 4]
for var number in numbers {
number++
}
print(numbers) // [0, 1, 2, 3, 4]
>>> numbers = [0,1,2,3,4]
>>> for number in numbers: number += 1
>>> numbers
[0, 1, 2, 3, 4] a = 5
=> None
b = a
=> None
object.__repr__(a)
=> '<int object at 0x7fd04cc16700>'
object.__repr__(b)
=> '<int object at 0x7fd04cc16700>'
b += 1
=> None
object.__repr__(b)
=> '<int object at 0x7fd04cc16720>'
b
=> 6
a
=> 5
>>> 256 is 256
True
>>> a = 256
>>> b = 256
>>> a is b
True
>>> 257 is 257
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 256
>>> b = 257
>>> a is b
False
>>> b -= 1
>>> a is b
True
a = 2 на a = 2.0. Данная оптимизация тут совершенно не причём: это иллюстрация к тому, что foo += bar есть foo = foo + bar, если у foo нет метода __iadd__ (в этом случае это будет foo.__iadd__(bar)). Ни у строк, ни у чисел в Python такого нет.object.__repr__(obj) можно использовать id(obj): он быстрее печатается. Правда, не показывает тип, но здесь тип очевиден.For each entry it assigns iteration values to corresponding iteration variables if present and then executes the block.
package main
import "fmt"
type A struct {
B string
}
func main() {
as := []A{{B: "asd"}, {B: "zxc"}}
for _, item := range as {
item.B = item.B + "!"
}
for _, item := range as {
fmt.Print(item.B) // asdzxc
}
fmt.Println()
for i, _ := range as {
as[i].B = as[i].B + "!"
}
for _, item := range as {
fmt.Print(item.B) // asd!zxc!
}
} play.golang.org/p/HCBcUB1Z6yforeach ($arr as &$value) {
$value = $value * 2;
}
no new variables on left side of :=
var v6 *int
int* v6;
func SomeFunc(i int) {}
type MyInteger int
void SomeFunc (int i) {}
typedef int MyInteger;
Но понимаете ли, стоит убрать внутренний контекст (фигурные скобки) и код заработает ровно так, как мы ожидаем («after 42»). Интересно девки пляшут, не так ли?
def test():
a=0
print "before: {}".format(a) #0
def up():
a = 1
print "insert: {}".format(a) #1
up()
print "after: {}".format(a) #0
var или (что еще лучше) let — значит новая переменная, если нет — берем из внешней области видимости. Ну т.е.function f() {
var a = 0;
var b = 1;
function g() {
var a = 2;
b = 3;
}
g();
console.log(a); // 0
console.log(b); // 3
}
Go просто относительно молодой язык, который ещё успеет отшлифоваться в процессе различных процессов.
Понимаете, Пайк и компания ясно дали всем еще в прошлом году понять, что «язык стабилен и мы не планируем его менять»
а он вообще считает, что подстветка кода не нужна, а лучший редактор это acme
Неужели на Go уже есть достаточное количество написанного кода, чтобы говорить об откатанности его фич?
А чем подсветка-то им не угодила?
Из-за того, что его так форсят, постоянно появляется куча новых статей и обсуждений
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5];
println!("{:?}", numbers);
println!("{:?}", &numbers[2..]);
println!("{:?}", &numbers[1..3]);
println!("{:?}", &numbers[0..numbers.len()-1]);
numbers.push(6);
println!("{:?}", numbers);
numbers.remove(2);
println!("{:?}", numbers);
numbers.insert(2, 3);
println!("{:?}", numbers);
let copiedNumbers = numbers.clone();
println!("{:?}", copiedNumbers);
}
let mut numbers = vec![1, 2, 3, 4, 5];
for number in &mut numbers {
*number += 1;
}
println!("{:?}", numbers);
И более гибко, например: list[ 0 , $ / 2 ] — половина массива.
items[0] = new FancyRune;
разработал язык на которой можно быстро (пере)обучить человека с минимальным бэкграундом и при этом не дать возможности этому новообученному специалисту простора для выстреливания в ногу.
нужно, чтобы код был прост и понятен, чтобы в нем не было немыслимых заковырок, определяемых не реальной потребностью реализовать именно так, а скорее мотивацией «зырьте как я могу».
// Чтобы скопировать слайс, ты должен будешь написать это:
//
copiedNumbers := make([]int, len(numbers))
copy(copiedNumbers, numbers)
// Интересный факт: отрицательные индексы не работают!
The omission of this feature (present in Python, for example) is deliberate
When performing arithmetic on slice indices it would be unfortunate if an erroneous negative result «just worked» as a reverse index. This leads to subtle bugs.
There are readability benefits to the status quo, also. It is clear that the Go expression s[:i] is creating a slice of s that is i bytes long. If i could be negative then the reader would need more context to understand the slice expression.
This is in keeping with Go's general philosophy of avoiding subtle syntactic tricks.
написать красивую функцию insert()
А новомодное дмецо, которое по хорошему на одну ладонь положить, другой прихлопнуть и растереть — лезет сегодня из всех дыр

Для начала хочется сказать, что тип rune для int32 вообще вызывает странное ощущение.
Вообще против концепции генерации кода.
Почему Go — это плохо продуманный язык программирования