うおのめマリーの満遊記

都会の団地でプー太郎をしているエンジニアの日常。たまに軽く仕事とったりしながらまったりとスローライフを満喫中。料理が得意です。

Go 定義編

Go 変数の宣言

初期値あり
    var i int = 1
    var f64 float64 = 1.2
    var s string = "test"
    var t bool = true
    var f bool = false
( )でまとめて定義することも可能
var (
    i    int     = 1
    f64  float64 = 1.2
    s    string  = "test"
    // ワンライナーで複数定義
    t, f bool    = true, false
)

期値なし

var i int
var f64 float64
var s string
var t bool
var f bool

Short variable declarations

  • varを省略可能
  • 関数内のみでしか宣言できない
  • 値から型を推測できるので省略可能
  • 明示的に型を宣言する場合はvarを使用して宣言する
  • 再代入可能だが再宣言は不可
func foo() {
    xi := 1
    xf64 := 1.2
    xs := "test"
    xt, xf := true, false
}

const

constの定義
const Pi = 3.14
( )でまとめて定義することも可能
const (
    Username = "test_user"
    Password = "test_pass"
)
オーバーフロー

型を定義した変数においてintで扱える最大数から計算をしようとするとオーバーフローする

var big int = 999999999999999999999 - 1
>>> untyped int constant 1000000000000000000000) as int value in variable declaration (overflows)

const定義の場合は明確に型を定義していないので 計算後に値をintとして出力することができるのでエラーにはならない

const big = 999999999999999999999 - 1
>>> 999999999999999999998

数値型

代表的な数値の型

uint8

int8

float32

complex64

var (
    u8  uint8     = 255
    i8  int8      = 127
    f32 float32   = 0.2
    c64 complex64 = -5 + 12i
  )
四則演算
fmt.Println("1 + 1 = ", 1+1)          >>> 1 + 1 =  2
fmt.Println("10 - 1 = ", 10-1)        >>> 10 - 1 =  9
fmt.Println("10 / 2 = ", 10/2)        >>> 10 / 2 =  5
fmt.Println("10 / 3 = ", 10/3)        >>> 10 / 3 =  3
fmt.Println("10.0 / 3 = ", 10.0/3)   >>> 10.0 / 3 =  3.3333333333333335
fmt.Println("10 / 3.0 = ", 10/3.0)   >>> 10 / 3.0 =  3.3333333333333335 
fmt.Println("10 % 2 = ", 10%2)         >>> 10 % 2 =  0
fmt.Println("10 % 3 = ", 10%3)   >>> 10 % 3 =  1
ビット演算子(シフト)
   x := 0
    fmt.Println(x)
    // x = x + 1
    x++
    fmt.Println(x)
    // x = x - 1
    x--
    fmt.Println(x)

文字列型

基本

fmt.Println("Hello World")
fmt.Println("Hello " + "World")
// ASCⅡ コード
fmt.Println("Hello World"[0]) 
>>> 72
fmt.Println(string("Hello World"[0])) 
>>> H
文字列の置換

*stringsパッケージをimportすること

下記例は変数stringをコピーして出力している(値渡し)

var s string = "Hello World"

fmt.Println(strings.Replace(s, "H", "X", 1))

>>> Xello World

// 参照渡しの場合
s = strings.Replace(s, "H", "X", 1)
文字を含むかの問合せ
fmt.Println(strings.Contains(s, "World"))
改行
fmt.Println("Test\n" + "Test")

// ``で囲う
fmt.Println(`Test2
 Test2
    Test2`)
"(ダブルクォーテーション)の出力
fmt.Println("\"")

fmt.Println(`"`)

論理値型

//var t, f bool = true, false
t, f := true, false
fmt.Printf("%T %v %t\n", t, t, t)
fmt.Printf("%T %v %t\n", f, f, t)
分離演算子
fmt.Println(true && true)   // true
fmt.Println(true && false)  // false
fmt.Println(false && false) // false

fmt.Println(true || true)   // true
fmt.Println(true || false)  // true
fmt.Println(false || false) // false

fmt.Println(!true)  // false
fmt.Println(!false) // true
# 型変換
##### int, floatの型変換
var x int = 1
xx := float64(x)
fmt.Printf("%T %v %f\n", xx, xx, xx) // float64 1 1.000000

    var y float64 = 1.2
    yy := int(y)
    // %dでintは表示できる
    fmt.Printf("%T %v %d\n", yy, yy, yy) // int 1 1

配列

package main

import "fmt"

func main(){
    //[2]intの部分が型となるので変更が効かない
    // 配列を宣言
    var a [2]int
    a[0] = 100
    a[1] = 200
    fmt.Println(a)
    
    // 初期値として値を入れる場合
    var b [2]int = [2]int{100, 200}
    fmt.Println(b)
    
    // var b [3]int = [3]int{100, 200}
    // b = append(b, 300) // errorになる
    
    var c []int = []int{100, 200}
    c = append(c, 300)
    fmt.Println(c)
}