Go学习第一章基础语法

1.1变量的定义和赋值

package main
 
import(
    "fmt"
)
 
//集中定义变量
var (
    aa = 2
    bb = true
    cc = "jack"
)

func variableZeroValue(){
    //定义变量不赋值会有一个默认的初始值
    var a int
    var s string
    fmt.Printf("%d %q
",a,s)   //格式化输出
}

func variableShorter(){
    //用冒号
    d,e,f := 5,false,"zhang"
    fmt.Println(d,e,f) //定义的变量不使用会报错
}
 
func main() {
    fmt.Println("helloworld")
    variableZeroValue()        //a,s初始值:0 ""
}

三种方法定义 var定义名后面加类型:var a int=1,让编译器自动选择类型:var a,b=1,"aa",使用冒号定义:a,b := 1,"aa"。

1.2数据类型以及枚举和常量

数字类型:(u)int8,int32,int64,float32,float64,complex64,complex128.....

字符串:byte,rune,uintptr(用于存放指针)

常量的定义:

package main
 
import(
    "fmt"
)
 
func main() {
    //不指定类型,则可以作为各种类型使用
    const a,b = 3,4
    //指定为string类型,则为指定的类型
    const str string  = "derek"
    const (  
        java = iota    //iota自增值枚举类型
        python
        golang
        javascript
    )
    fmt.Println(java,python,golang,javascript) //0 1 2 3
    fmt.Println(a,b,str)     //3 4 derek
}

1.3条件语句

if不需要加括号且里可以赋值:

package main
 
import(
    "fmt"
    "io/ioutil"
)
 
func main() {
    const filename = "C:\Users\86158\Desktop\awesomeProject\src\abc.txt"
    //ioutil.ReadFile:返回两个值,一是读出内容,二是error信息
    //if的条件里可以赋值
    if contents,err := ioutil.ReadFile(filename); err != nil{
        fmt.Println(err)
    }else {
        fmt.Printf("%s
",contents)
    }
    //if条件里赋值变量的作用域就在if语句里,外面访问报错
}

switch不需要break自动跳出,语句后可以没有表达式:

package main
 
import(
    "fmt"
)
//string是返回值类型 
func grade(score int) string{
    g := ""
    switch {
    case score < 0 || score > 100:
        //报错信息
        panic(fmt.Sprintf("错误的分数:%d",score))
    case score < 60:
        g = "D"
    case score < 80:
        g = "C"
    case score < 90:
        g = "B"
    case score <= 100:
        g = "A"
    }
    return g
}
 
func main() {
    fmt.Println(grade(2))
    fmt.Println(grade(101))     //panic: 错误的分数:101
}

for语句条件里不需要括号,可省略初始条件,结束条件,递增表达式:

package main
 
import "fmt"
 
func main() {
    sum := 0
    for i :=1; i <= 100; i++{
        sum += i
    }
    for { //不写条件就是死循环,没有while
        fmt.Println(sum)  
    }      
    fmt.Println(sum)
}

1.4函数

函数返回值写在最后并且可以有多个,函数也可以作为参数:

package main
 
import "fmt"
 
//返回两个值
func div(a,b int) (q,r int){
    return a / b, a % b
}
 
func main() {
    q,r := div(13,3)
    //如果只想接收一个返回值,可以用“_”
    q,_ := div(13,3)
    fmt.Println(q,r)       //4 1
}

 1.5指针

指针也是一个变量,它存储的数据是另一个变量的内存地址,自身也有一个内存地址。

值传递是将实际参数复制一份到函数中,引用传递(slice,map,channel,inrerface,fun())是将实际参数的地址传递到函数中,c++例子:

#include <stdio.h>

void pa_by_val(int a){
    a++;
}

void pa_by_ref(int& a){
    a++;
}

int main(){
    int a = 3;
    pa_by_val(a);
    printf("After pa_by_val: %d
", a); // 值传递 3
    
    pa_by_ref(a);
    printf("After pa_by_ref: %d
", a); // 引用传递 4
}

引用传递指针参数传递到函数内,引用传递例子:

package main

import "fmt"

func main() {
   a, b := 100, 200
   /* 调用 swap()
   * &a指向a指针,a变量地址
   * &b指向b指针,b变量地址
   */
   swap(&a, &b)
   fmt.Println(a,b) /* 200 100 */ 
}

func swap(x , y *int) {
   *x,*y = *y,*x      
}

指针操作&:取地址,*:根据地址取值,用法:

package main
 
import "fmt"
 
func main() {
    var a int = 2
    var pa *int = &a
    *pa = 3
    fmt.Println(a)     //3
}
原文地址:https://www.cnblogs.com/hacknoone/p/13440887.html