本文共 6963 字,大约阅读时间需要 23 分钟。
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959
变量名由字母、数字、下划线组成,不能以数字开头。
...var ( A int //默认为0 B string //默认为"" C bool //默认为false Name string = "suoning" Age = 18 // 自动识别类型)func main() { sex := "man" //等价于 var sex string = "man" var girlfriend string //声明变量 girlfriend = "Dawn" //变量赋值 Name := "Nick" //正确 //girlfriend := "Jenny" //错误的!不能申明两次 ...}
常量使用const 修饰,代表永远是只读的,不能修改。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
语法:const identifier [type] = value,其中type可以省略。
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。
...const ( A = 'a' //97 B = iota //1 C //2 D = "nick" //"nick" iota += 1 E //"nick" iota += 1 F = 618 //618 iota +=1 G //618 iota +=1 H = iota //7 I //8)...
布尔型的值只可以是常量 true 或者 false。
var a boolvar a bool = truevar a = false
int:
float:
其它:
package mainfunc main() { var a int var b int32 var c int64 a = 15 //b = a + a // compiler error b = int32(a + a) // ok b = b + 5 // ok: 5 is a constant c = c + 5 // ok}
存储为ascii码
var a byte = 'a'fmt.Println(a) //97
字符串表示两种方式:
string底层就是一个byte的数组
string本身是不可变的,因此要改变string中字符,需要如下操作:
str := "hello world"s := []byte(str)s[0] = 'o'str = string(s)
位运算符对整数在内存中的二进制位进行操作。
注意 else if / else 位置
if condition1 {} else if condition2 {} else if condition3 { } else {}
for循环条件没有小括号
for i := 0; i < 10; i++ {}
死循环
for true {}可以简写为:for {}
range
for i, v := range str {}
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch。
switch var {case var1:case var2:case var3:default:}
可以使用fallthrough强制执行后面的case代码。
label要写在for循环的开始而不是结束的地方。直接break退出到指定的位置。
func lab() {LABLE: for i := 0; i < 10; i++ { for true { i++ if i == 6 { break LABLE } fmt.Println(i) } }}
goto语句可以跳转到本函数内的某个标签
func got() { i := 0HERE: fmt.Println(i) i++ if i == 5 { return } goto HERE}
select与switch类似,不过select有较多限制。
每个case语句里必须是一个channel操作;
select {case ch <- 0: //如果0写入,则进行该casecase <- ch: //如果读到数据,则进行该casedefault: //如果上面的都没有成功,则进入default处理}
Go 语言最少有个 main() 函数。
函数声明告诉了编译器函数的名称,返回类型,和参数。
不支持重载,一个包不能有两个名字一样的函数。
func function_name( [parameter list] ) [return_types] { 函数体}
命名返回值的名字(return可以不指定变量):
_标识符,用来忽略返回值:
函数也是一种类型,一个函数可以赋值给变量
package mainimport "fmt"//申明一个函数类型type add_func func(int, int) intfunc add(a, b int) int { return a + b}func operator(op add_func, a int, b int) int { return op(a, b)}func main() { c := add fmt.Println(c) //0x1087050 sum := operator(c, 1, 2) fmt.Println(sum) //300}
其中arg是一个slice,我们可以通过arg[index]依次访问所有参数;通过len(arg)来判断传递参数的个数。
0个或多个参数func add(arg…int) int {}
1个或多个参数func add(a int, arg…int) int {}
2个或多个参数func add(a int, b int, arg…int) int {}
匿名函数是由一个不带函数名的函数声明和函数体组成。
package mainfunc main() { f := func(x, y int) int { return x + y } f(1,1) ch := make(chan int) func (ch chan int) { ch <- 9 }(ch)}
闭包是一个函数和与其相关的引用环境组合而成的实体。
函数可以存储到变量中作为参数传递给其它函数,能够被函数动态的创建和返回。
func Adder() func(int) int { var x int return func(d int) int { x += d return x }}f := Adder()fmt.Println(f(1)) //1fmt.Println(f(10)) //11fmt.Println(f(100)) //111
无论是值传递,还是引用传递,传递给函数的都是变量的副本;
值传递是值的拷贝,引用传递是地址的拷贝;
一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。
map、slice、chan、指针、interface默认以引用的方式传递。
new 内置函数 用来分配内存,主要用来分配值类型,比如int、struct,返回的是指针;
make 内置函数 用来分配内存,主要用来分配引用类型,比如chan、map、slice。
普通类型,变量存的就是值,也叫值类型;
指针类型,变量存的是一个地址,这个地址存的才是值。
变量是一种占位符,用于引用计算机内存地址;
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
获取指针类型所指向的值,使用:*。
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。
申明如下:
var age *int //指向整型var height *float32 //指向浮点型
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
package mainimport "fmt"func main() { var ptr *int num := 100 ptr = &num fmt.Println(ptr) //0xc42000e1f8 fmt.Println(*ptr) //100 *ptr = 200 fmt.Println(num) //200}
package mainimport "fmt"func change(num *int) { fmt.Println(num) //0xc42000e1f8 fmt.Println(*num) //100 *num = 1000 fmt.Println(num) //0xc42000e1f8 fmt.Println(*num) //1000}func main() { num := 100 fmt.Println(&num) //0xc42000e1f8 change(&num) fmt.Println(&num) //0xc42000e1f8 fmt.Println(num) //1000}
转载地址:http://dwaym.baihongyu.com/