Golang编程示例
生成随机数
package main
import (
"fmt"
"math/rand"
"time"
)
func randrange(min, max int) int {
return min + rand.Intn(max-min)
}
func main() {
rand.Seed(time.Now().Unix())
var m, n int
fmt.Print("请输入数字范围:")
fmt.Scanf("%d %d", &m, &n)
fmt.Printf("random number is %v\n", randrange(m,n))
}
猜数字
package main // 声明包名
import ( // vscode会自动导入外部函数库
"fmt"
"math/rand"
"time"
)
func randrange(min, max int) int { // 生成指定范围内的随机数
rand.Seed(time.Now().Unix())
return min + rand.Intn(max-min)
}
func main() { // golang只认 main() 这个入口函数
fmt.Printf("猜数字\n")
var (
guess int
times = 0
)
number := randrange(1, 100)
xxx: // golang独有的打标签,就能跳出这里
// for count := 3; count > 0; count-- { // 带有次数循环
for { // 无限循环, golang就用for代替了while
fmt.Printf("请输入你猜的数字:")
fmt.Scanf("%d", &guess)
switch { // 超级万能的牛逼的分支结构
case guess < number:
fmt.Println("小了")
times += 1 // 类似python的语法
case guess > number:
fmt.Println("大了")
times++ // 类似C的语法
case guess == number:
times++
fallthrough
default:
time.Sleep(time.Second)
fmt.Printf("猜对了,正确数是:%v, 猜了%v次\n", number, times)
break xxx
}
}
}
计算圆角率
package main
import (
"fmt"
)
func main() {
var (
pi float64 = 0
number = 3.0
n = 0
)
i := 0
pi = 1 - 1/number
fmt.Print("输入计算次数(必须大于100000):")
fmt.Scanf("%d", &n)
if n < 100000 {
n = 100000
}
for i < n {
number += 2
pi += 1 / number
number += 2
pi -= 1 / number
i++
}
pi = pi * 4
fmt.Println("进行", n, "次运算后π=", pi)
}
接口与组合范例
package main
import (
"fmt"
"math"
"reflect"
)
type Igeometry interface {
area() float64
perim() float64
}
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
func (r rect) area() float64{
return r.width * r.height
}
func (r rect) perim() float64 {
return (r.width + r.height) * 2
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func(c circle) perim() float64 {
return math.Pi * c.radius * 2
}
func measure(g Igeometry) {
fmt.Println(reflect.TypeOf(g), g)
fmt.Printf("%.2f\n",g.area())
fmt.Printf("%.2f\n",g.perim())
}
func main(){
r := rect{width: 4, height: 5}
c := circle{radius: 5}
measure(r)
measure(c)
}
泛型模式的错误处理
func Try(err error) {
if err != nil {
panic(err)
}
}
func Try1[V any](val V, err error) V {
Try(err)
return val
}
func Try2[V1 any, V2 any](val1 V1, val2 V2, err error) (V1, V2) {
Try(err)
return val1, val2
}
一个例子:
// 不使用泛型的传统实现
func GetExePath() string {
path, err := os.Executable()
if err != nil {
panic(err)
}
return path
}
// 使用泛型,告别 `if err != nil`
func GetExePath() string {
return Try1(os.Executable())
}