循环
go中只有 for 循环
const repeatCount = 5
func Repeat(character string) string {
var repeated string
for i := 0; i < repeatCount; i++ {
repeated += character
}
return repeated
}
数组
数组允许你以特定的顺序在变量中存储相同类型的多个元素
切片类型,它可以接收不同大小的切片集合
numbers := [5]int{1, 2, 3, 4, 5}
// 数组
func Sum(numbers [5]int) int {
sum := 0
for _, number := range numbers {
sum += number
}
return sum
}
// range 会迭代数组,每次迭代都会返回数组元素的索引和值。我们选择使用 _ 空白标志符 来忽略索引。
// 切片
mySlice := []int{1,2,3}
// make 可以在创建切片的时候指定我们需要的长度和容量
sums = make([]int, 2)
// 获取部分切片
slice[low:high]
// 使用 len 获取数组和切片的长度
// 使用 reflect.DeepEqual,它在判断两个变量是否相等。
结构体 方法 接口
方法和函数很相似但是方法是通过一个特定类型的实例调用的。函数可以随时被调用,比如 Area(rectangle)。不像方法需要在某个事物上调用。
package integers
import (
"math"
"testing"
)
// Shape is implemented by anything that can tell us its Area
type Shape interface {
Area() float64
}
// Rectangle has the dimensions of a rectangle
type Rectangle struct {
Width float64
Height float64
}
// Area returns the area of the rectangle
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// Perimeter returns the perimeter of a rectangle
func Perimeter(rectangle Rectangle) float64 {
return 2 * (rectangle.Width + rectangle.Height)
}
// Circle represents a circle...
type Circle struct {
Radius float64
}
// Area returns the area of the circle
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func TestPerimeter(t *testing.T) {
rectangle := Rectangle{10.0, 10.0}
got := Perimeter(rectangle)
want := 40.0
if got != want {
t.Errorf("got %.2f want %.2f", got, want)
}
}
func TestArea(t *testing.T) {
checkArea := func(t *testing.T, shape Shape, want float64) {
t.Helper()
got := shape.Area()
if got != want {
t.Errorf("got %.2f want %.2f", got, want)
}
}
t.Run("rectangles", func(t *testing.T) {
rectangle := Rectangle{12, 6}
checkArea(t, rectangle, 72.0)
})
t.Run("circles", func(t *testing.T) {
circle := Circle{10}
checkArea(t, circle, 314.1592653589793)
})
}