1.基础相关
package main import "fmt" // 入口函数 func main() { fmt.Println("hello world") fmt.Println("good morning") hello() s,minus := sum(2,3) fmt.Println(minus) fmt.Println(s) var name = "tom" fmt.Println(name) convertCharacter() } // Go官方推荐用单行注释来注释代码 func hello() { fmt.Println("ddd") } // 求和,求差与多个返回值 func sum(i int,j int) (sum int,minus int) { sum = i + j minus = j - i return sum,minus } // 转义 func convertCharacter() { // 制表符 fmt.Println("a\tb\tc") // 换行符 fmt.Println("a\nb") // 一个\ fmt.Println("\\hh") // 一个" fmt.Println("\"") // 一个回车 fmt.Println("a\rb") // demo fmt.Println("姓名\t\t年龄\t\t籍贯\t\t性别\n张三\t\t23\t\t上海\t\t女") }
2.变量相关
package main import ( // 若没有用到某个包,又不删除,则在其前部加上下划线即可 "fmt" "unsafe" "strconv" ) func main() { fmt.Println(g1,g2,g3,g4) fn01() fn02() fn03() fn04() fn05() fn06() fn07() fn08() fn09() fn10() fn11() defaultFun() fn12() fn13() fn14() fn15() } //////////////////////////定义全局变量/////////////////////////////// // 函数之外的变量是全局变量,一个文件中只能出现一个,不得重复定义 var g1 = 99 var g2 = "i love golang" var ( g3 = "tim" g4 = false ) //////////////////////////单变量声明///////////////////////////////// func fn01() { // 第一种声明变量方式:变量=var + 变量名 + 变量类型 + 值 var i int = 8 fmt.Print(i,",") // 该区域的数值可以在一定范围内不断变化 i = 10 fmt.Print(i,") i = 90 fmt.Println(i) // 不能令i = ‘tim‘或者i =false } func fn02() { // 第二种声明变量方式,若未赋值,则使用默认值 // int 默认值是0,string默认值是空串,小数默认是0 var i int fmt.Println(i) } func fn03() { // 第三种声明变量方式:若未定义类型,则自动类型推导 var num = 1.034 fmt.Println(num) } func fn04() { // 第四种声明变量方式:// 第二种声明变量方式:若未定义类型,则自动类型推导 name := "jerry" fmt.Println(name) } ////////////////////////多变量声明////////////////////////// func fn05() { // 第一种声明变量方式 var n1,n2,n3,n4 int fmt.Println(n1,n4) } func fn06() { // 第二种声明变量方式 var n1,n3 = 1,"tom",100.99 fmt.Println(n1,n3) } func fn07() { // 第三种声明变量方式 n1,n3 := "jerry",3,true fmt.Println(n1,n3) } func fn08() { // 程序中+号的使用 // 当都是数值型:int型,float32,float64型时,做加法运算 var ( j float64 = 1.5 k = 1.5 ) fmt.Println(k + j) // 当都是字符串时,做拼接 fmt.Println("i am " + "tom") } ////////////////////////golang中的基本数据类型///////////////////////// // 基本数据类型,也称值类型,变量存的就是值 // 整型(默认是0),浮点型(默认是0),布尔型(默认false),字符串型(默认"") func defaultFun() { var a int var b float32 var c float64 var d bool var e string fmt.Printf("基本数据类型默认值: a=%d,b=%f,c=%f,d=%v,e=%v\n",a,b,c,d,e) } /* 整型 有符号(正负号) int8(-2的7次方----2的7次方减1) int16(-2的15次方----2的15次方减1) int32(-2的31次方----2的31次方减1) int64(-2的63次方----2的63次方减1) 无符号(没有正负号 unit8(0----2的8次方) unit16(0----2的16次方) unit32(0----2的32次方) unit64(0----2的64次方) 其他类型 int 与操作系统相关,若是64位,则等价于int64;若是32位,则等价于int32 rune 等价于int32,但表示的是unicode码 byte 等价于unit8,当要存储字符时,选用byte unit 与操作系统相关,则等价于int32 注意事项: 1.若未声明,则默认使用int型,如: var i = 10,则i为int型 2.查看变量类型及字节大小:切记是Printf fmt.Printf("i的变量类型是%T,占用的字节数是%d",i,unsafe.Sizeof(i)) 3.在保证功能的基础上,尽量选择占用内存较少的类型,如年龄尽量选取byte型 */ func fn09() { var f09 = 10 fmt.Printf("f09的变量类型是%T,占用的字节数是%d\n",f09,unsafe.Sizeof(f09)) ////////////字符常量用单引号包裹//////////////// // golang中没有字符类型,用byte表示 var n1 byte = ‘a‘ // 输出ascii值 fmt.Println("n1=",n1) // 输出原值 fmt.Printf("n1=%c \n",n1) // 若是超过了byte范围,则用int型 var n2 = ‘王‘ fmt.Printf("n2=%c n2的ASCII值是%d\n",n2) // 给出一个数值,可以找出其对应的ASCII字符 var n3 = 29579 fmt.Printf("n3=%c\n",n3) // ASCII可以进行运算 var n4 = 10 + ‘m‘ fmt.Println("n4=",n4) // 字符在计算机的存取过程 // 存储: 字符-->对应码值-->二进制-->存储 // 读取: 二进制-->码值-->字符-->读取 // 字符和码值的对应关系是通过字符编码表实现的,UTF-8较为常用,go语言中编码统一设置成了utf-8 // UTF-8中,一个字母占1个字节,一个汉字占3个字节 } /* 浮点型 float32:单精度,4个字节,(-2的31次方----2的31次方减1) float64:双精度,8个字节,(-2的63次方----2的63次方减1) 注意事项: 1.浮点型的存储分为三部分,符号位+指数位+尾数位,存储时,精度会有丢失 2.若未声明,默认使用float64型,如: var k = 9.99,则k为float64型 3.当对精度要求高时,尽量选取float64位 4.常量表示: n1 := 5.12e3 n2 := 4e-1 */ func fn10() { n1 := 5.12e3 n2 := 4e-1 fmt.Println(n1,n2) } /* 布尔类型(bool类型,占1个字节,主要用于逻辑运算,流程控制中会用到) true false 注意事项: 默认值是false */ func fn11() { var b = true fmt.Printf("b=%c b占用空间是%d\n",unsafe.Sizeof(b)) } /* string型 字符串是由一串固定长度的字符连接起来的字符序列,go中的字符串是由单个字节连接起来的 注意事项; 1.统一使用UTF-8编码 2.字符串是不可变的,一旦赋值,无法改变 3.字符串的2种表示方式: 双引号包裹: 可以识别转义字符 反引号包裹: 以字符串原生的形式输出,包括换行和转义字符,可防止攻击,输出源代码等 4.字符串拼接: var k = "aaa" + "bbb" k += "ccc" */ //////////////////golang中基本数据类型的转换/////////////////////////////// // 数值型之间的转换 // 与Java不同,golang中无论高转低还是低转高,都需要强转 // 被转换的数据,在转换后,其数据类型与转换前保持一致 func fn12() { var n1 = 10 var n2 = int32(n1) i := n2 + 33 fmt.Println(n1,i) } //////基本数据类型转为string类型/////////// func fn13() { var n1 = 10 // int var n2 = true //bool var n3 = 3.45 // float64 var n4 byte = 35 // byte var str string // string str = fmt.Sprintf("%d",n1) // int转为string fmt.Println(str) str = fmt.Sprintf("%t",n2) // int转为bool fmt.Println(str) str = fmt.Sprintf("%f",n3) // int转为float64 fmt.Println(str) str = fmt.Sprintf("%d",n4) // int转为bool fmt.Println(str) } func fn14() { var n1 = 2 var n2 = false var n3 = 4.5 var str string str = strconv.FormatInt(int64(n1),10) fmt.Println(str) hhh := strconv.Itoa(n1) fmt.Println(hhh) str = strconv.FormatBool(n2) fmt.Println(str) // f:格式 3:小数点后的位数 64:表示双精度 str = strconv.FormatFloat(n3,‘f‘,64) fmt.Println(str) } //////string类型转为基本数据类型/////////// func fn15() { var str1 = "true" var str2 = "123" var str3 = "12.345" // 转为bool时,会返回2个值,bool,error,可用下划线忽略error值:如果此处不是合法参数,如hello,则会直接转为false b,_ := strconv.ParseBool(str1) fmt.Println(b) // 转为int:如果此处不是合法参数,则会直接转为0 // 第二个参数是进制,第三个参数分别为0(int型),8,16,32,64 i,err := strconv.ParseInt(str2,10,0) fmt.Println(i,err) // 转为float:如果此处不是合法参数,则会直接转为0 f,_ := strconv.ParseFloat(str3,64) fmt.Println(f) }
3.指针(值类型和引用类型)
package main import "fmt" func main() { pointer01() pointer02() } /* 数据类型 基本数据类型,也称值类型 值类型包括:int,float,string,struct,数组 变量存的就是值 内存通常在栈中分配 引用类型包括:指针,slice切片,map,管道chan,interface 变量存储的是一个地址,这个地址对应的空间才是真正的值 内存通常在堆中分配 */ func pointer01() { var i = 1 // 这个地址和i的值在同一地方 fmt.Println("i在内存中的地址是:",&i) } ////////指针变量存的是一个地址,该地址指向的空间地址才是真正的值所在 /////// i------------>0xc00004a080----(10)(值引用时,值和地址在同一处) /////// ^ /////// ^ /////// ^ /////// ptr---------->0xc000072020----(0xc00004a080)(指针引用时,值和地址不在一处) /////// func pointer02() { var i = 1 var ptr *int = &i // 取地址 fmt.Println("ptr的值是:",&ptr) // 取值 fmt.Println("ptr的值是:",*ptr) // 通过ptr修改i的值 *ptr = 2 fmt.Println(i) }