c++と比較した時のgo。印象を箇条書きで クラスという概念がない?関数と構造体だけで頑張る感じなのか?かなりcに近い言語っていうイメージだな。構造体があれば言うてもクラス作れるからな。
しかしソースコードを見てみると、メソッドみたいにアクセスしてるんやが?どういうことや?
package datastruct import "fmt" // Queue implementation type Queue struct { data []int size int } // NewQueue instantiates a new queue func NewQueue(cap int) *Queue { return &Queue{data: make([]int, 0, cap), size: 0} } // Push adds a new element at the end of the queue func (q *Queue) Push(n int) { q.data = append(q.data, n) q.size++ } // Pop removes the first element from queue func (q *Queue) Pop() bool { if q.IsEmpty() { return false } q.size-- q.data = q.data[1:] return true } // Front returns the first element of queue func (q *Queue) Front() int { return q.data[0] } // IsEmpty checks if the queue is empty func (q *Queue) IsEmpty() bool { return q.size == 0 } // String implements Stringer interface func (q *Queue) String() string { return fmt.Sprint(q.data) } import ( "fmt" "testing" ) func TestQueue(t *testing.T) { queue := NewQueue(10) fmt.Println(queue) if !queue.IsEmpty() { t.Fatalf("True is expected, but %v\n", queue.IsEmpty()) } queue.Push(10) fmt.Println(queue) queue.Push(1) fmt.Println(queue) queue.Push(-5) fmt.Println(queue) if queue.IsEmpty() { t.Fatalf("False is expected, but %v\n", queue.IsEmpty()) } if queue.Front() != 10 { t.Fatalf("10 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if queue.Front() != 1 { t.Fatalf("1 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if queue.Front() != -5 { t.Fatalf("-5 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if !queue.IsEmpty() { t.Fatalf("True is expected, but %v\n", queue.IsEmpty()) } } なるほど、cっぽい感じで、構造体とそれを操作する関数に分かれているけど、関数はメソッドのように構造体に紐づく。 cでは、関数に構造体のポインタを渡さないと構造体に変更を加えることができなかったけど、goでは構造体か関数を呼び出せるやんか。んで、この構造体に紐づけられているメソッドのような関数の定義方法はgo特有の定義方法になっているって話ですよね。
...