1.变量创建
package main
import "fmt"
func main() {
//声明变量
var age int
//赋值
age = 18
//使用
fmt.Println("age = ",age)
}
声明和赋值可以结合,变量不可重复定义,赋值的类型必须和声明的一致
2.变量使用
package main
import "fmt"
func main() {
//1正常
var age int = 18
fmt.Println("age = ",age)
//2不赋值,默认值
var age2 int
fmt.Println("age2 = ",age2)
//3不写类型赋值,自动推断
var age3 = "Tom"
fmt.Println("age3 = ",age3)
//4省略var的写法
sex := "男"
fmt.Println("sex = ",sex)
fmt.Println("---------------")
//多个变量
var n1,n2,n3 int
var m1,m2,m3 = 10,"abc",7.8
p1,p2 := 6.9,100
}
结果
多变量可以直接定义和赋值
2.全局变量
定义在函数外和c++一样
package main
import "fmt"
//全局变量
//一个一个定义
var q1 = 100
//多个定义
var (
q2 = 200
q3 = 300
)
func main() {
fmt.Println("q1 = ", q1)
fmt.Println("q2 = ", q2)
fmt.Println("q3 = ", q3)
}
3.数据类型
int+数字 其位数是确定的,int8就是8位
int和uint的范围根据系统位数而定
3.默认类型
整数为int
浮点为float64
4.字符串string
1)是常量不可修改
2)string拼接的时候 + 一定要留在行末尾,否则末尾添加分号会自动结束该行然后报错
3)字符的表现形式(普通格式+含有特殊转义字符格式)
如果含有大量特殊转义字符为了方便需要使用反引号。在反引号中,换行可以直接在字符串中,而双引号中必须用转义方式
4)其他类型转字符串的两种方式
package main
/*
其他类型转字符串
*/
import (
"fmt"
"strconv"
)
func main() {
//Printf转字符串
var m1 int = 19
var s1 string = fmt.Sprintf("%d",m1) //转成string
fmt.Printf("s1对应的类型: %T , s1 = %q \n", s1, s1)
//其他类型也类似,只是转字符串的控制字符不同,%q比%v多一个""
//-----------------------------------
// strconv库(麻烦)
var n1 = 18
//把n1转成10进制,第一个参数要求传入int64类型,第二个是进制数,具体看api手册
var s2 = strconv.FormatInt(int64(n1), 10)
fmt.Printf("s2对应的类型: %T , s2 = %q \n", s2, s2)
var n2 = 4.29
//输入数据 表示格式(小数十进制) 保留9位小数 输入数据float64类型
var s3 = strconv.FormatFloat(n2, 'f', 9, 64)
fmt.Printf("s3对应的类型: %T , s3 = %q \n", s3, s3)
var n3 = true
var s4 string = strconv.FormatBool(n3)
fmt.Printf("s4对应的类型: %T , s4 = %q \n", s4, s4)
}
5)字符串转其他类型
package main
/*
其他类型转字符串
*/
import (
"fmt"
"strconv"
)
func main() {
//string->bool
var s1 string = "true"
var b bool
//返回一个bool和一个error值
b, _ = strconv.ParseBool(s1)
fmt.Printf("b的类型是 %T,b=%v \n", b, b)
//string-> int64
var s2 string = "19"
var num1 int64
num1, _ = strconv.ParseInt(s2, 10, 64)
fmt.Printf("num1的类型:%T,num1 = %v \n", num1, num1)
//string-> float64
var s3 string = "3.14"
var f1 float64
f1, _ = strconv.ParseFloat(s3, 64)
fmt.Printf("f1的类型:%T,f1= %v \n", f1, f1)
}
如果string转var的类型不合适,会按默认值输出。
比如"abcd"转成bool会变成默认的false
5.指针
1)&符号取地址,*取值,类似cpp
package main
/*
指针
*/
import (
"fmt"
)
func main() {
//与符号取地址,很像cpp
var age int = 18
fmt.Println(&age)
var ptr *int = &age
fmt.Println(ptr)
//*表示指针取值
fmt.Println("ptr指向的值:", *ptr)
fmt.Printf("ptr指向的值:%v", *ptr)
}
2)一些指针的注意点
【1】指针赋值一定要赋指针类型,否则报错
【2】指针赋值对应类型一定要正确
ps:可以用一些标识符当成变量,但是不建议。
变量长度无限制,但是尽量简短有意义
6.package的包名尽量和上级目录一致,不一致不会报错
1)main包下放了main函数,是程序执行入口,之前的目录可以加一级main文件夹比较合理
2)命名不要和提供的库名冲突
3)变量名、函数名、常量名采用驼峰命名
!!!!重点 特性
3)变量名、函数名、常量名的首字母实现访问权限控制
如果变量首字母大写,那么包外可访问。
如果变量首字母小写,则仅限本包访问。
把完整绝对路径项目前面到src的部分去掉,从这里算相对路径。
GOPATH作为系统环境变量需要配置,gopath就是D:\golang\goProject,然后到下面的src里
ps:windows系统复制路径之后要改反斜杠为斜杠
ps:后续项目管理有更方便的gomod方式,这里先用传统gopath
代码例子:
package main
/*
gopath方法,不能开go mod
*/
import (
"fmt"
"gocode/testproject01/unit2/demo17/test"
)
/* 首字母实现访问权限控制 */
func main() {
//fmt.Println(test.pwd) //不可访问
fmt.Println(test.StuNo)
}
package test
/* 首字母实现访问权限控制 */
var StuNo int = 20000 //包外可访问
var pwd string = "123456" //包内可访问
7.关键字和预定义标识符