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()) }