微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

golang语言基础(一)

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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐