文件名&关键字&标识符
1. 所有go源码以 .go结尾
2. 标识符以字母或者下划线开头,大小写敏感:add, Add, _add
_是特殊标识符,用来忽略结果
3. 保留关键字
Go程序基本结构
package main import “fmt” func main() { fmt.Println(“hello, world”) } //1. 任何一个代码文件隶属于一个包 //2. import 关键字,引用其他包 //3. golang可执行程序,package main,并且有且只有一个main入口函数 //4. 包中函数调用: a. 同一个包中函数,直接调用 b. 不同包中函数,通过 包名.函数名 进行调用 //5. 包访问控制规则 大写意味着这个函数/变量是可导出的 小写意味着这个函数/变量是私有的,包外部不能访问
函数声明和注释
1. 函数声明: func 函数名字 (参数列表) (返回值列表){}
func add() {}
func add(a int , b int) int {}
func add(a int , b int) (int, int) {}
2. 注释,两种注释,单行注释: // 和多行注释 /* */
常量和变量
常量
1. 常量使用const 修饰,代表永远是只读的,不能修改
2. const 只能修饰boolean,number(int相关类型、浮点类型、complex)和string
3. 语法:const identifier [type] = value,其中type可以省略
const b string = "hello world" const b = "helloworld" const a = 10 const res = getValue() //错误示例
const(
a = 0
b = 1
c = 2
)
const(
a = iota
b //1
c //2
)
变量
语法:var identifier type
var (
a int //默认为0
b string //默认为””
c bool //默认为false
d = 8
e = “hello world”
)
值类型和引用类型
1 值类型:变量直接存储值,内存通常在栈中分配
基本数据类型int、float、bool、string以及数组和struct
2 引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。
指针、slice、map、chan等都是引用类型
变量作用域
在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部
在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的,则作用于整个程序。
数据类型和操作符
1 bool类型,只能存true和false
var a bool
var a bool = true
var a = true
2 相关操作符 ! && ||
3 数字类型,主要有int、int8、int16、int32、int64、uint8、uint16、uint32、uint64、float32、float64
4 类型转换,type(variable),比如:var a int=8; var b int32=int32(a)
package main func main() { var a int var b int32 a = 15 b = a + a // compiler error
b = int32(a+a) b = b + 5 // ok: 5 is a constant }
5 逻辑操作符: == 、!=、<、<=、>和 >=
数学操作符:+、-、*、/等等
6 字符类型:var a byte
var a byte = 'c'
7 字符串类型: var str string
8 字符串表示两种方式: 1)双引号 2)`` (反引号)
var str2 = `hello this is a test string This is a test string too·`
1 #string到int 2 int,err:=strconv.Atoi(string) 3 #string到int64 4 int64, err := strconv.ParseInt(string, 10, 64) 5 #int到string 6 string:=strconv.Itoa(int) 7 #int64到string 8 string:=strconv.FormatInt(int64,10)
几个例子
1 // main 2 package main 3 4 import ( 5 "fmt" 6 ) 7 8 func is_prime(num int) bool { 9 if num == 1 { 10 return false 11 } 12 for i := 2; i < num; i++ { 13 if num%i == 0 { 14 return false 15 } 16 } 17 return true 18 } 19 20 func main() { 21 22 var count int 23 for i := 100; i <= 200; i++ { 24 if is_prime(i) { 25 count++ 26 fmt.Println(i) 27 } 28 } 29 fmt.Println("totally prime number: ", count) 30 }
1 // main 2 package main 3 4 import ( 5 "fmt" 6 "strconv" 7 ) 8 9 func is_narcissistic(num int) bool { 10 num_str := strconv.Itoa(num) 11 length := len(num_str) 12 var sum int 13 for i := 0; i < length; i++ { 14 tmp, _ := strconv.Atoi(num_str[i : i+1]) 15 //fmt.Println(tmp) 16 sum += tmp * tmp * tmp 17 18 } 19 20 if sum == num { 21 return true 22 } 23 return false 24 } 25 26 func main() { 27 var count int 28 for i := 100; i < 1000; i++ { 29 if is_narcissistic(i) { 30 count++ 31 fmt.Println(i) 32 } 33 } 34 fmt.Println("total number: ", count) 35 }
1 // main 2 package main 3 4 import ( 5 "fmt" 6 ) 7 8 func factorial(num int) int { 9 var result = 1 10 for i := 1; i <= num; i++ { 11 result *= i 12 } 13 return result 14 } 15 16 func factorial_sum(num int) int { 17 var sum int 18 for i := 1; i <= num; i++ { 19 sum += factorial(i) 20 } 21 return sum 22 } 23 24 func main() { 25 res := factorial_sum(3) 26 fmt.Println(res) 27 }
8.1 strings和strconv使用
strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 。
strings.HasSuffix(s string, suffix string) bool:判断字符串s是否以suffix结尾
// main package main import ( "fmt" "strings" ) func urlProcess(url string) string { result := strings.HasPrefix(url, "http://") if !result { url = fmt.Sprintf("http://%s", url) } return url } func pathProcess(path string) string { result := strings.HasSuffix(path, "/") if !result { path = fmt.Sprintf("%s/", path) } return path } func main() { var ( url string path string ) fmt.Scanf("%s%s", &url, &path) fmt.Println(urlProcess(url)) fmt.Println(pathProcess(path)) }
strings.Index(s string, str string) int:判断str在s中首次出现的位置,如果没有出现,则返回-1
strings.LastIndex(s string, str string) int:判断str在s中最后出现的位置,如果没有出现,则返回-1
strings.Replace(str string, old string, new string, n int):字符串替换
strings.Count(str string, substr string)int:字符串计数
strings.Repeat(str string, count int)string:重复count次str
strings.ToLower(str string)string:转为小
strings.ToUpper(str string)string:转为大写
strings.TrimSpace(str string):去掉字符串首尾空白字符
strings.Trim(str string, cut string):去掉字符串首尾cut字符
strings.TrimLeft(str string, cut string):去掉字符串首cut字符
strings.TrimRight(str string, cut string):去掉字符串首cut字符
strings.Field(str string):返回str空格分隔的所有子串的slice
strings.Split(str string, split string):返回str split分隔的所有子串的slice
strings.Join(s1 []string, sep string):用sep把s1中的所有元素链接起来
strings.Itoa(i int):把一个整数i转成字符串
strings.Atoi(str string)(int, error):把一个字符串转成整数
9 时间 和日期类型
9.1. time包
9.2. time.Time类型,用来表示时间
9.3. 获取当前时间, now := time.Now()
9.4. time.Now().Day(),time.Now().Minute(),time.Now().Month(),time.Now().Year()
9.5. 格式化,fmt.Printf(“%02d/%02d%02d %02d:%02d:%02d”, now.Year()…)
9.6 . time.Duration用来表示纳秒
9.7. 一些常量:
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
9.8. 格式化:
now := time.Now()
fmt.Println(now.Format(“02/1/2006 15:04”))
fmt.Println(now.Format(“2006/1/02 15:04”))
fmt.Println(now.Format(“2006/1/02”))
1 // main 2 package main 3 4 import ( 5 "fmt" 6 "time" 7 ) 8 9 func main() { 10 now := time.Now() 11 fmt.Println(now.Format("2006/01/02 15:04:00")) 12 }
10 指针类型
10.1. 普通类型,变量存的就是值,也叫值类型
10.2. 获取变量的地址,用&,比如: var a int, 获取a的地址:&a
10.3. 指针类型,变量存的是一个地址,这个地址存的才是值
10.4. 获取指针类型所指向的值,使用:*,比如:var *p int, 使用*p获取p指向的值