第二章:基础语法 2.1 变量声明 显式声明 package mainimport "fmt" func main ( ) { // 方式1:var关键字声明 var namestring = "张三" var ageint = 25 var heightfloat64 = 1.75 var isStudentbool = true fmt. Printf ( "姓名: %s, 年龄: %d, 身高: %.2f, 是否学生: %v\n" , name, age, height, isStudent) // 方式2:类型推断 var city= "北京" // 自动推断为string var population= 2100 // 自动推断为int fmt. Printf ( "城市: %s, 人口: %d万\n" , city, population) // 方式3:批量声明 var ( firstNamestring = "小" lastNamestring = "明" scoreint = 95 ) fmt. Printf ( "全名: %s%s, 分数: %d\n" , firstName, lastName, score) } 短变量声明(:=) package mainimport "fmt" func main ( ) { // 短变量声明,只能在函数内部使用 name:= "李四" age:= 30 salary:= 15000.50 isMarried:= false fmt. Printf ( "姓名: %s, 年龄: %d, 薪资: %.2f, 已婚: %v\n" , name, age, salary, isMarried) // 多变量同时声明 x, y, z:= 1 , 2 , 3 fmt. Printf ( "x=%d, y=%d, z=%d\n" , x, y, z) // 交换变量值 x, y= y, x fmt. Printf ( "交换后: x=%d, y=%d\n" , x, y) } 常量 package mainimport "fmt" // 单个常量 const PI= 3.14159265358979 // 批量常量 const ( StatusOK= 200 StatusNotFound= 404 StatusError= 500 ) // iota枚举 const ( Sunday= iota // 0 Monday// 1 Tuesday// 2 Wednesday// 3 Thursday// 4 Friday// 5 Saturday// 6 ) // iota表达式 const ( _ = iota // 忽略第一个值 KB= 1 << ( 10 * iota ) // 1 << 10 = 1024 MB// 1 << 20 = 1048576 GB// 1 << 30 = 1073741824 TB// 1 << 40 ) func main ( ) { fmt. Printf ( "PI = %.4f\n" , PI) fmt. Printf ( "HTTP状态码: OK=%d, NotFound=%d, Error=%d\n" , StatusOK, StatusNotFound, StatusError) fmt. Printf ( "今天是星期: %d\n" , Wednesday) fmt. Printf ( "1KB = %d字节\n" , KB) fmt. Printf ( "1MB = %d字节\n" , MB) fmt. Printf ( "1GB = %d字节\n" , GB) } 2.2 数据类型 基本数据类型 package mainimport ( "fmt" "unsafe" ) func main ( ) { // 整数类型 var i8int8 = 127 // -128 到 127 var i16int16 = 32767 // -32768 到 32767 var i32int32 = 2147483647 // -2^31 到 2^31-1 var i64int64 = 9223372036854775807 var u8uint8 = 255 // 0 到 255 var u16uint16 = 65535 // 0 到 65535 fmt. Printf ( "int8: %d, 大小: %d字节\n" , i8, unsafe. Sizeof ( i8) ) fmt. Printf ( "int16: %d, 大小: %d字节\n" , i16, unsafe. Sizeof ( i16) ) fmt. Printf ( "int32: %d, 大小: %d字节\n" , i32, unsafe. Sizeof ( i32) ) fmt. Printf ( "int64: %d, 大小: %d字节\n" , i64, unsafe. Sizeof ( i64) ) fmt. Printf ( "uint8: %d, 大小: %d字节\n" , u8, unsafe. Sizeof ( u8) ) fmt. Printf ( "uint16: %d, 大小: %d字节\n" , u16, unsafe. Sizeof ( u16) ) // 浮点类型 var f32float32 = 3.14 var f64float64 = 3.14159265358979 fmt. Printf ( "float32: %.2f, 大小: %d字节\n" , f32, unsafe. Sizeof ( f32) ) fmt. Printf ( "float64: %.14f, 大小: %d字节\n" , f64, unsafe. Sizeof ( f64) ) // 复数类型 var c1complex64 = 1 + 2i var c2complex128 = 3 + 4i fmt. Printf ( "complex64: %v\n" , c1) fmt. Printf ( "complex128: %v\n" , c2) fmt. Printf ( "实部: %.0f, 虚部: %.0f\n" , real ( c2) , imag ( c2) ) // 布尔类型 var b1bool = true var b2bool = false fmt. Printf ( "bool: %v, %v\n" , b1, b2) // 字节类型 (uint8的别名) var chbyte = 'A' fmt. Printf ( "byte: %c, ASCII: %d\n" , ch, ch) // Unicode字符类型 var rrune = '中' fmt. Printf ( "rune: %c, Unicode: %U\n" , r, r) } 字符串类型 package mainimport ( "fmt" "strings" "unicode/utf8" ) func main ( ) { // 字符串声明 s1:= "Hello, 世界" s2:= `这是一个 多行字符串` fmt. Println ( s1) fmt. Println ( s2) // 字符串长度 fmt. Printf ( "字节长度: %d\n" , len ( s1) ) fmt. Printf ( "字符长度: %d\n" , utf8. RuneCountInString ( s1) ) // 字符串遍历 fmt. Println ( "按字节遍历:" ) for i:= 0 ; i< len ( s1) ; i++ { fmt. Printf ( "%x " , s1[ i] ) } fmt. Println ( ) fmt. Println ( "按字符遍历:" ) for i, ch:= range s1{ fmt. Printf ( "索引: %d, 字符: %c\n" , i, ch) } // 字符串操作 fmt. Printf ( "包含'世界': %v\n" , strings. Contains ( s1, "世界" ) ) fmt. Printf ( "前缀'Hello': %v\n" , strings. HasPrefix ( s1, "Hello" ) ) fmt. Printf ( "后缀'世界': %v\n" , strings. HasSuffix ( s1, "世界" ) ) fmt. Printf ( "索引位置: %d\n" , strings. Index ( s1, "世界" ) ) fmt. Printf ( "替换: %s\n" , strings. Replace ( s1, "世界" , "Go" , 1 ) ) fmt. Printf ( "分割: %v\n" , strings. Split ( "a,b,c" , "," ) ) fmt. Printf ( "连接: %s\n" , strings. Join ( [ ] string { "a" , "b" , "c" } , "-" ) ) fmt. Printf ( "转大写: %s\n" , strings. ToUpper ( "hello" ) ) fmt. Printf ( "转小写: %s\n" , strings. ToLower ( "HELLO" ) ) fmt. Printf ( "去空格: '%s'\n" , strings. TrimSpace ( " hello " ) ) fmt. Printf ( "重复: %s\n" , strings. Repeat ( "Go" , 3 ) ) } 2.3 类型转换 package mainimport ( "fmt" "strconv" ) func main ( ) { // 数值类型转换 var iint = 42 var ffloat64 = float64 ( i) var uuint = uint ( f) fmt. Printf ( "int: %d\n" , i) fmt. Printf ( "float64: %.2f\n" , f) fmt. Printf ( "uint: %d\n" , u) // 字符串与数值转换 // 整数转字符串 s1:= strconv. Itoa ( 42 ) fmt. Printf ( "整数转字符串: %s, 类型: %T\n" , s1, s1) // 字符串转整数 i2, err:= strconv. Atoi ( "123" ) if err!= nil { fmt. Println ( "转换错误:" , err) } else { fmt. Printf ( "字符串转整数: %d, 类型: %T\n" , i2, i2) } // 浮点数转字符串 s2:= strconv. FormatFloat ( 3.14159 , 'f' , 2 , 64 ) fmt. Printf ( "浮点转字符串: %s\n" , s2) // 字符串转浮点数 f2, err:= strconv. ParseFloat ( "3.14" , 64 ) if err!= nil { fmt. Println ( "转换错误:" , err) } else { fmt. Printf ( "字符串转浮点: %.2f\n" , f2) } // 布尔值转换 b, err:= strconv. ParseBool ( "true" ) if err!= nil { fmt. Println ( "转换错误:" , err) } else { fmt. Printf ( "字符串转布尔: %v\n" , b) } // 格式化字符串 name:= "张三" age:= 25 score:= 95.5 s3:= fmt. Sprintf ( "姓名: %s, 年龄: %d, 分数: %.1f" , name, age, score) fmt. Println ( s3) // 类型判断 var xinterface { } = "hello" switch v:= x. ( type ) { case int : fmt. Printf ( "x是int: %d\n" , v) case string : fmt. Printf ( "x是string: %s\n" , v) case bool : fmt. Printf ( "x是bool: %v\n" , v) default : fmt. Printf ( "x是未知类型: %T\n" , v) } }