Go基础(1)

时间:2023-03-10 04:22:58
Go基础(1)

demo1:

package add

var Name string = "hello world"
var Age int = 10
package main

import (
"DEMO/test/day2/example2/add"
"fmt"
) func main() { fmt.Println("Name:", add.Name)
fmt.Println("Age:", add.Age) }

分析:

1.调包,需要写GOPATH目录下src目录之后的路径

  比如我电脑的GOPATH:D:\PROJECT\GO_PROJECT

  我的add包目录:D:\PROJECT\GO_PROJECT\src\DEMO\test\day2\example2\add

2.一个文件夹里面只能有一个包,最好同名

3.main函数必须在main包中

4.private变量小写首字母,public变量大写首字母即可

demo2:

package add

var Name string = "test"
var Age int = 666 func init() {
Name = "Hello World!"
Age = 10
}
package main

import (
a "DEMO/test/day2/example3/add"
"fmt"
) func main() { fmt.Println("Name:", a.Name)
fmt.Println("Age:", a.Age) }

分析:

1.导入的包可以取别名,比如我这里的a

2.init函数在初始赋值后执行,所以这里应该输出的是helloworld和10

demo3:

package main

import (
"fmt"
) func modify(a int) {
a = 10
return
} func modity(a *int) {
*a = 10
return
} func main() {
a := 5
b := make(chan int, 1)
fmt.Println("a =", a)
fmt.Println("b =", b)
modify(a)
fmt.Println("a =", a)
modity(&a)
fmt.Println("a =", a)
}

分析:

1.依次输出:a = 5,b = 0xc0000160e0,a = 5,a = 10

2.理解修改地址和修改引用的区别

demo4:

package main

import "fmt"

func swap(a *int, b *int) {
temp := *a
*a = *b
*b = temp
return
} func go_swap(a int, b int) (int, int) {
return b, a
} func main() {
three := 3
four := 4
swap(&three, &four)
fmt.Println("---Swap---")
fmt.Println("three =", three)
fmt.Println("four =", four)
three, four = go_swap(three, four)
fmt.Println("---Swap---")
fmt.Println("three =", three)
fmt.Println("four =", four)
}

分析:

1.两种交换都是正确的

2.理解传统c语言交换函数以及多返回值形式的交换函数

demo5:

package main

import (
"fmt"
"math/rand"
"time"
) func init() {
rand.Seed(time.Now().UnixNano())
} func main() {
fmt.Println("---Generate Random Number---")
fmt.Println("--Int---")
for i := 0; i < 3; i++ {
a := rand.Int()
fmt.Println(a)
}
fmt.Println("---Int(100)---")
for i := 0; i < 3; i++ {
a := rand.Intn(100)
fmt.Println(a)
}
fmt.Println("---Float32---")
for i := 0; i < 3; i++ {
a := rand.Float32()
fmt.Println(a)
}
}

分析:

1.简单的随机数生产程序,学会rand和time的基本使用

2.根据当前的精确时间给rand一个种子,保证随机的不确定性

demo6:

package main

import "fmt"

func reverse1(str string) string {
var result string
strLen := len(str)
for i := 0; i < strLen; i++ {
result += fmt.Sprintf("%c", str[strLen-i-1])
}
return result
} func reverse2(str string) string {
var result []byte
tmp := []byte(str)
lenth := len(str)
for i := 0; i < lenth; i++ {
result = append(result, tmp[lenth-i-1])
}
return string(result)
} func main() {
str := "hello world!"
result := reverse2(str)
fmt.Printf("str:%s\nresult:%s\n", str, result)
}

分析:

1.反转字符串的两种形式

demo7:

package main

import (
"fmt"
"math"
) func main() {
min := 1
max := 100
for i := min; i <= max; i++ {
var flag bool = true
if i == 1 {
flag = false
}
for j := 2; j <= int(math.Sqrt(float64(i))); j++ {
if i%j == 0 {
flag = false
break
}
}
if flag {
fmt.Printf("%d是素数\n", i)
}
}
}

分析:

1.求1-100的所有质数

2.注意求指数过程优化,除数最大达到根号被除数即可

demo8:

package main

import (
"fmt"
"strconv"
) func main() {
min := 1
max := 1000
for i := min; i <= max; i++ {
if isNarcissisticNumber(i) {
fmt.Printf("%d是水仙花数\n", i)
}
}
} func isNarcissisticNumber(n int) bool {
tmp := strconv.Itoa(n)
data := []byte(tmp)
lenth := len(data)
var result int = 0
for i := 0; i < lenth; i++ {
number, _ := strconv.Atoi(string(data[i]))
result += number * number * number
}
if n == result {
return true
} else {
return false
}
}

分析:

1.求水仙花数的一种实现

2.这里的Atoi是多返回值函数,用不到的返回值用“_”代替即可

3.这里是字符串处理的方式实现,还可以用除10的数学方式实现

demo9:

package main

import "fmt"

func main() {
fmt.Println(factorial(5))
} func factorial(n uint) uint {
if n == 0 {
return 1
}
if n == 1 {
return n
}
return n * factorial(n-1)
}

分析:

1.利用递归实现阶乘,是比较优秀的实现方式