diff --git a/all/golangconfig.py b/all/golangconfig.py
index d73d72c..cf57e0f 100644
--- a/all/golangconfig.py
+++ b/all/golangconfig.py
@@ -289,18 +289,39 @@
     # user experience, especially around debugging
     is_str = isinstance(setting, str_cls)
     if is_str:
-        if os.path.exists(setting):
-            return (setting, source)
 
-        if debug_enabled():
-            print(
-                'golangconfig: the value for %s from %s - "%s" - does not exist on the filesystem' %
-                (
-                    setting_name,
-                    source,
-                    setting
-                )
+        multiple_values = False
+
+        if setting_name == 'GOROOT':
+            if os.path.exists(setting):
+                return (setting, source)
+
+        if setting_name == 'GOPATH':
+            values = setting.split(os.pathsep)
+            multiple_values = len(values) > 1
+            missing = False
+
+            for value in values:
+                if not os.path.exists(value):
+                    missing = True
+                    break
+
+            if not missing:
+                return (setting, source)
+
+        if multiple_values:
+            value_desc = "one of the values"
+        else:
+            value_desc = "the value"
+        print(
+            'golangconfig: %s for %s from %s - "%s" - does not exist on the filesystem' %
+            (
+                value_desc,
+                setting_name,
+                source,
+                setting
             )
+        )
 
     elif debug_enabled():
         _debug_unicode_string(setting_name, setting, source)
diff --git a/dev/tests.py b/dev/tests.py
index 0e6e3aa..4d3cab4 100644
--- a/dev/tests.py
+++ b/dev/tests.py
@@ -539,6 +539,34 @@
             )
             self.assertTrue('does not exist on the filesystem' in sys.stdout.getvalue())
 
+    def test_setting_value_multiple_gopath_one_not_existing(self):
+        shell = '/bin/bash'
+        env = {
+            'GOPATH': '{tempdir}bin%s{tempdir}usr/bin' % os.pathsep
+        }
+        with GolangConfigMock(shell, env, None, None, {'debug': True}) as mock_context:
+            mock_context.replace_tempdir_env()
+            mock_context.make_dirs(['usr/bin'])
+            self.assertEquals(
+                (None, None),
+                golangconfig.setting_value('GOPATH', mock_context.view, mock_context.window)
+            )
+            self.assertTrue('one of the values for GOPATH' in sys.stdout.getvalue())
+
+    def test_setting_value_multiple_gopath(self):
+        shell = '/bin/bash'
+        env = {
+            'GOPATH': '{tempdir}bin%s{tempdir}usr/bin' % os.pathsep
+        }
+        with GolangConfigMock(shell, env, None, None, {'debug': True}) as mock_context:
+            mock_context.replace_tempdir_env()
+            mock_context.make_dirs(['bin', 'usr/bin'])
+            self.assertEquals(
+                (env['GOPATH'], shell),
+                golangconfig.setting_value('GOPATH', mock_context.view, mock_context.window)
+            )
+            self.assertEqual('', sys.stdout.getvalue())
+
     def test_setting_value_gopath_not_string(self):
         shell = '/bin/bash'
         env = {
