文件名&关键字&标识符
1、所有go源码以.go结尾
2、标识符以字母或下划线开头,大小写敏感(Boy 大写的标识符其他包可以调用)
3、_是特殊标识符,用来忽略结果
4、保留关键字
2、go程序的基本结构
package mainimport “fmt”func main() { fmt.Println(“hello, world”)}
1. 任何一个代码文件隶属于一个包
2. import 关键字,引用其他包:
import(“fmt”)
import(“os”)
通常习惯写成:
import (
“fmt”
“os”
)
3. golang可执行程序,package main, 并且有且只有一个main入口函数
4. 包中函数调用:
a. 同一个包中函数,直接调用
b. 不同包中函数,通过包名+点+ 函数名进行调用
c.每个源文件都可以包含一个init函数,这个init函数自动被go运行框架调用。
d.执行顺序,先执行全局变量初始化,然后执行init函数,然后实行main函数。
5. 包访问控制规则:
a.大写意味着这个函数/变量是可导出的
b.小写意味着这个函数/变量是私有的, 包外部不能访问
add/add.go
package addvar Name string = "xxxxx"var Age int = 100 //声明变量的时候赋值,:=相当于执行的时候赋值,执行语句必须有入口/*var Name stringvar Age int//Name = "hello world" 直接赋值报错,因为这就相当于执行语句,go中执行语句必须有入口,不然编译报错//Age = 10 // 每个源文件都可以包含一个init函数,这个init函数自动被go运行框架调用。
*/
func init () { Name = "hello world" Age = 10 }
main/main.go
package mainimport( a "go_dev/day2/example2/add" // a为包的别名,如果别名为_导入初始化而不引用 "fmt")func main() { fmt.Println("Name=", a.Name) fmt.Println("age=", a.Age)}
函数声明和注释
1、函数声明: func 函数名字 (参数列表) (返回值列表){}
func add() {} func add(a int , b int) int {} func add(a int , b int) (int, int) {}
2、 注释,两种注释,单行注释: // 和多行注释 /* */
变量声明
var v1 intvar v2 stringvar v3 [10]intvar v4 []intvar v5 struct{ f int}var v6 *intvar v7 map[string]intvar v8 func(a int) int
变量声明时的初始化:
var v1 int = 10var v2 = 10v3 := 10 //不能用于全局变量的声明
条件判断、选择、循环
1、条件判断
if case1{ //}else if case2{ // }else{}
if ture{ //}if a==1&&b==1{ //}if b<0 || b>10{ //}if c !=0{ //}
if语法糖
var b=100if b>200{}//语法糖if b:=10;b>200{}
2、选择语句
switch i { case 0: fmt.Println(0) case 1: fmt.Println(1) }
3、循环语句
for init;case1;modify{} for a = 0; a < 10; a++ { fmt.Println(a) }
死循环
for case1{}var a int = 0 for a < 10 { fmt.Println(a) a++ } //无限循环for{}
跳出指定的外层循环、继续循环:
break
break 语句可以结束 for、switch 和 select 的代码块。break 语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的 for、switch 和 select 的代码块上。
for{ if i>10{ break } }
JLoop: for j:=0;j<5;j++{ for i:=0;i<10;i++{ if i>5{ break JLoop } fmt.Println(i) } }
continue
continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 内使用。在 continue 语句后添加标签时,表示开始标签对应的循环。
for{ if i>10{ continue }}
OuterLoop: for i := 0; i < 2; i++ { for j := 0; j < 5; j++ { switch j { case 2: fmt.Println(i, j) continue OuterLoop } } }
4、跳转语句
i:=0HERE:fmt.Println(i)i++if i<10{ goto HERE}
- 数组、切片、字符串返回索引和值。
- map 返回键和值。
- 通道(channel)只返回通道内的值。
遍历数组、切片
for key, value := range []int{ 1, 2, 3, 4} { fmt.Printf("key:%d value:%d\n", key, value)}
字符串:
- ASCII 字符串遍历直接使用下标。
- Unicode 字符串遍历用 for range。
str := "hello world" for index, val := range str { fmt.Printf("index:%d val:%c \n", index, val) }
//这种遍历是以字节的形式遍历的 str := "hello 世界"n := len(str)for i :=0;i
map:
m := map[string]int{ "hello": 100, "world": 200, } for key, value := range m { fmt.Println(key, value) }
习题:
1. 判断 101-200 之间有多少个素数,并输出所有素数。
2. 打印出100-999中所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字 立方和等于该数本身。例如:153 是一个“水仙花数”,因为 153=1 的三次 方+5 的三次方+3 的三次方。
3. 对于一个数n,求n的阶乘之和,即: 1! + 2! + 3!+…n!
package main// godoc -http=:9001 然后127.0.0.1查看go的文档import{ "fmt" "math" }func main(){ for i:=101;i<200,i++{ if isPrime(i){ fmt.Println(i) } } for i:=100,i<999;i++{ if isNarcissistic(i){ fmt.Println(i) } } fmt.Println(factorial(10)) }func isPrime(n int) bool{ if n<=1{ return false } for i:=2;i999{ return false } i,j,k := float64(n/100),float64(n/10%10),float64(n%10) if math.Pow(i,3)+math.Pow(j,3)+math.Pow(k,3)==float64(n){ return true } return false }func factorial{ if n<=0{ return -1 var cnt int for i:=2;i<=n;i++{ cnt=cnt *i } return cnt }