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.利用递归实现阶乘,是比较优秀的实现方式